题意:字符串的每个前缀在原字符串中出现的次数和
思路:我们求出字符串的next数组,对于每个前缀,最少有一个,然后对于每个位置我们看他的next数组值是否大于0,如果大于0,ans++
代码:(有点看不懂网上得到通解)
#include <cstdio> #include <cstring> const int maxn=2e5+7; const int MOD=10007; char a[maxn]; int len; int next[maxn]; void getNext(char T[]) { int j, k; j = 0; k = -1; next[0] = -1; while(j < len) if(k == -1 || T[j] == T[k]) next[++j] = ++k; else k = next[k]; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d",&len); scanf("%s",a); memset(next,0,sizeof(next)); getNext(a); // for(int i=0;i<=len;i++){ // printf("%d ",next[i]); // } // puts(""); int ans=len%MOD; for(int i=1;i<=len;i++){ if(next[i]>0)ans++; ans%=MOD; } printf("%d ",ans); } return 0; }