题目链接:https://cn.vjudge.net/problem/HDU-3336
题意:字符串所有前缀的出现次数
题解:dp[ i ] 表示以i为结尾 i 前缀的个数 ,所以dp[i] = dp[nex[i] ] + 1
#include <bits/stdc++.h>
using namespace std;
const int N = 200100;
const int mod = 10007;
int nex[N], dp[N];
void get_nex(char *s) {
int len = strlen(s);
int i = 0, j = -1;
nex[0] = -1;
while(i < len) {
if(j == -1 || s[i] == s[j])
nex[++i] = ++j;
else
j = nex[j];
}
}
int main() {
int T, n;
char s[N];
long long ans;
scanf("%d", &T);
while(T--) {
scanf("%d %s", &n, s);
get_nex(s);
dp[0] = 0;
ans = 0;
for(int i = 1; i <= n; i++) {
dp[i] = dp[nex[i]] + 1;
ans = (ans + dp[i]) % mod;
}
printf("%d\n", ans);
}
return 0;
}