hdu 3336 kmp
来源:互联网 发布:橙树网络 编辑:程序博客网 时间:2024/05/16 10:07
//我们在这里使用的是算法导论中求解π数组的方法并且用到了dp // dp【i】=dp【next【i】】+1,dp【next【i】】在前面的计算中一定计算过了,//1表示的是到i本身的这个前缀,比如abab来说//next数组值为0012,dp[1]=dp[next[1]]+1=1//dp[2]=dp[next[2]]+1=dp[0]+1=1,dp[3]=dp[next[3]]+1=dp[1]+1=2,这是因为除了aba本身外还有一个最后的小a//dp[4]=dp[next[4]]+1=dp[2]+1=2,这是因为abab本身加上后面的ab,这个ab前面已经计算出来了 #include<iostream>using namespace std;char p[200005];int dp[200005];int next[200005];void compute_prefix(int len){ int k=0; for(int q=2;q<=len;q++){ while(k>0&&p[k+1]!=p[q]) k=next[k]; if(p[k+1]==p[q]) k=k+1; next[q]=k; }}int main(){ int i,n,t,sum; cin>>t; while(t--){ sum=0; memset(dp,0,sizeof(dp)); memset(next,0,sizeof(next)); cin>>n; scanf("%s",p+1); compute_prefix(n); for(i=1;i<=n;i++){ dp[i]=dp[next[i]]+1; sum=(sum+dp[i])%10007; } cout<<sum<<endl; } return 0; }