题意:给一个串,求出这个串所有前缀出现的次数和。
之前没考虑到,next[i]指第i个字符新加进来时的最长公共前后缀长度;
当i=6时,即加上第6个字符b时,next[6] = 4,此时前缀abab == 后缀abab(加粗位置为新加入的字符b),结果+1, 而next[4] = 2,则ab == ab,即前缀abab 与 后缀abab中的ab相等,但因为后面的b是新加进来的,所以结果+1。
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e8 + 5;
char p[N];
int next[N], l, ans;
void get_next(){
int i = 0,j = -1;
next[0] = -1;
while(i < l)
{
if(j == -1 || p[i] == p[j]){
next[++i] = ++j;
for(int k = next[i]; k > 0; k = next[k]){
++ans;
}
if(ans >= 10007){
ans %= 10007;
}
}
else j = next[j];
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &l);
getchar();
scanf("%s", p);
ans = l;
get_next();
printf("%d\n", ans);
}
return 0;
}