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 }
View Code

 

posted @ 2016-08-11 15:59  N维解析几何  阅读(130)  评论(0编辑  收藏  举报