给定n(n<=10)个字符串环,每个字符串的长度为m(m<=500),保证每个字符串中只有小写字母,求出每个字符串环有多少个本质不同的子串(两个字符串不相同则认为本质不同)。
输入
一共有n+1行输入
第一行输入n,表示测试实例的个数
接下来的n行,每行包括一个测试实例
输出
对于每个测试实例,输出该字符串环中本质不同的子串个数,每个输出占一行。
样例输入
2
aaa
abc
样例输出
3
9
求个源码,谢谢了
#include<bits/stdc++.h>
using namespace std;
set<string> result;
string str,key;
int main()
{
int N,length;
cin >> N;
while (N--){
cin >> str;
length = str.size();
str+=str;
result.clear();
for(int z=1;z<=length;z++){
for(int z1=0;z1<length;z1++){
key = str.substr(z1,z);
result.insert(key);
// cout << key << endl;
}
}
cout << result.size() << endl;
}
return 0;
}
这个题应该可以先补齐字串然后找子串。 具体是比如abc 然后补成 abcab 之后在这个补齐的字串中找长度从1到原始字串长度3的不同子串
k
如有帮助,望采纳
class Solution {
public:
int findSubstringInWraproundString(string p) {
vector<int> vifindl(26,0);
vifindl[p[0]-'a'] = 1;
int plen = p.size();
int index = 0;
for(int i = 1; i < plen; i++)
{
if(p[i]-p[i-1] != 1 && (p[i] != 'a' || p[i-1] != 'z'))
{
for(int k = 0; k < i - index; k ++)
{
vifindl[p[index+k]-'a'] = vifindl[p[index+k]-'a'] > i - (index+k)? vifindl[p[index+k]-'a']:i - (index+k);
}
index = i;
}
}
for(int k = 0; k < plen - index; k ++)
{
vifindl[p[index+k]-'a'] = vifindl[p[index+k]-'a'] > plen - (index+k)? vifindl[p[index+k]-'a']:plen - (index+k);
}
return accumulate(vifindl.begin(),vifindl.end(),0);
}
};
参考代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int base = 131;
char s[10025];
ull mod = 10000019;
int n, z = 1;
ull a[10025];
ull hashe(char s[]){
int size = strlen(s);
ull z = 0;
for(int i = 0; i < size; i++)
{
z = (z * base + (ull)s[i]) % mod;
}
return z;
}
int main(){
scanf("%d", &n);
for(int i = 1;i <= n; i++)
{
scanf("%s", s);
a[i] = hashe(s);
}
sort(a+1, a+n+1);
for(int i = 1;i < n; i++)
{
if(a[i] != a[i+1])
z++;
}
printf("%d", z);
}
#include <bits/stdc++.h>
using namespace std;
set<string> ans;
string s, c;
int main(){
int n;
cin >> n;
while (n--){
cin >> s;
int l = s.size();
s += s;
ans.clear();
for (int i = 1; i <= l; i++){
for (int j = 1; j <= l; j++){
c = s.substr(j, i);
ans.insert(c);
}
}
cout << ans.size() << endl;
}
return 0;
}