hdu3336(Count the string)KMP的应用

2014-11-24 12:41:35 · 作者: · 浏览: 0

题意:给一个字符串,计算所有前缀在字符串中出现的次数和。


解法:KMP计算出Next数组后,每个位置的Next数组不断往前递归,每次相应前缀次数就加1.


代码:

/******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
           #include 
           
             #include 
            
              #include 
             
               //freopen ("in.txt" , "r" , stdin); using namespace std; #define eps 1e-8 const double pi=acos(-1.0); typedef long long LL; const int Max=200100; const int INF=10007; int Next[Max]; int num[Max]; char s[Max]; int len=0; void get_next() { int i=0; int j=Next[0]=-1; while(i
              
               >t; while(t--) { //memset(num,0,sizeof num); scanf("%d",&len); scanf("%s",s); get_next(); for(int i=0;i<=len;i++) { num[i]=1; int t=Next[i]; while(t>0) { num[t-1]=(num[t-1]+1)%INF; t=Next[t]; } } int ans=0; for(int i=0;i