大意 :
找出n个前缀出现了多少次
求出next函数 每个点有dp[i]=dp[next[i]]+1次;
ac代码
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=200010; const int mod = 10007; char str[maxn]; int len; int dp[maxn],next1[maxn]; void getnext(){//模版部分 int i=0,j=-1; next1[0]=-1; while(i<len){ if(j==-1||str[i]==str[j]) next1[++i]=++j; else j=next1[j]; } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d %s",&len,str); getnext(); memset(dp,0,sizeof(dp)); int ans=0; for(int i=1;i<=len;i++){//用strlen会超时 dp[i]=dp[next1[i]]+1; ans=(ans+dp[i])%mod; } printf("%d\n",ans); } }