poj 3336 Count the string
给一个字符串,求该字符串的所有前缀在该字符串中出现的次数
分析:首先,每个前缀都至少出现一次,然后,每次用kmp匹配成功的时候,都至少会匹配一个前缀,以abab举例,ab匹配成功的时候的,ab出现一次,如果是abababab呢,那么abab匹配到最后,还多
匹配了一次ab,那么也要计算上
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=1e6+5; 6 const int mod=10007; 7 int ans; 8 char s[maxn]; 9 int f[maxn],len; 10 11 void getfail(){ 12 f[0]=f[1]=0; 13 for(int i=1;i<len;i++){ 14 int j=f[i]; 15 while(j&&s[i]!=s[j])j=f[j]; 16 f[i+1]=s[i]==s[j]?j+1:0; 17 int k=f[i+1]; 18 while(k){ 19 ans++;ans%=mod; 20 k=f[k]; 21 } 22 } 23 } 24 25 int main(){ 26 ios::sync_with_stdio(false); 27 int t;cin>>t; 28 while(t--){ 29 cin>>len; 30 cin>>s; 31 ans=len; 32 getfail(); 33 cout<<ans<<endl; 34 } 35 return 0; 36 }