zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Android Handler研究(1)
    知识树杂谈Java面试(4)
    BAT级别分类
    知识树杂谈Android面试(3)
    知识树杂谈(2)
    mac iterm2安装、sshpass密码记住
    一万小时定律
    第17章(下)--集合
    第17章(中)--集合
    第17章(上)--集合
  • 原文地址:https://www.cnblogs.com/jihe/p/5761321.html
Copyright © 2011-2022 走看看