环绕字符串的子字符串个数(实在做不出来,只能做到普通字符串)

给定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;
}

img

这个题应该可以先补齐字串然后找子串。 具体是比如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;
}