求出字符串每个前缀的出现次数之和,用KMP算法中求next数组的变种算出
每个字符最远前缀的出现位置
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 200005, mod = 10007;
int next[maxn];
char ch[maxn];
int n, len[maxn];
void get_next()
{
int i, j = 0; next[1] = 0;
for(i = 2; i <= n; i++)
{
while(j > 0 && ch[j + 1] != ch[i])
j = next[j];
if(ch[j + 1] == ch[i]) j++;
next[i] = j;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int cas;
scanf("%d", &cas);
while(cas--)
{
cin>>n;
scanf("%s", ch + 1);
get_next();
int ans = 0;
fill(len, len + n + 1, 1);
for(int i = n; i >= 1; i--)
{
if(next[i])
{
len[next[i]] += len[i];
len[next[i]] %= mod;
}
ans += len[i];
ans %= mod;
}
printf("%d\n", ans);
}
return 0;
}