标签:
KMP算法的综合练习
DP很久没写搞了半天才明白。本题结合Next[]的意义以及动态规划考察对KMP算法的掌握。
1 4 abab
6
1 #include<iostream> //KMP+DP 2 #include<memory.h> 3 using namespace std; 4 char s[200005]; 5 int Next[200005],DP[200005]; //DP[i]表示子串s[0~i]共含有以s[i]为结尾的前缀的数目 6 int l; 7 8 void GetNext(){ 9 int i=0,j=-1; 10 Next[0]=-1; 11 while(i<l){ 12 if(j==-1||s[i]==s[j]){ 13 i++; 14 j++; 15 Next[i]=j; 16 } 17 else 18 j=Next[j]; 19 } 20 } 21 22 int main() 23 { 24 int n,k,num; 25 cin>>n; 26 while(n--){ 27 cin>>l>>s; 28 GetNext(); 29 num=0; 30 memset(DP,0,sizeof(DP)); 31 for(k=1;k<=l;k++){ 32 DP[k]=DP[Next[k]]+1; //s[i]结尾的前缀数就是自己本身加上以s[Next[i]]结尾的前缀数 33 num=(num+DP[k])%10007; 34 } 35 cout<<num<<endl; 36 } 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/Locked-J/p/4298100.html