poj 3461Oulipo

题目链接:http://poj.org/problem?id=3461

统计字符串出现的次数

  1 #include<cstdio>  
  2 #include<iostream>  
  3 #include<algorithm>
  4 #include<math.h> 
  5 #include<string.h>  
  6 #include<vector> 
  7 #include<queue>
  8 #include<iterator>
  9 #include<vector>
 10 #include<set>
 11 #define dinf 0x3f3f3f3f
 12 typedef long long ll;
 13 //const int Max=(1<<16)+10;
 14 using namespace std;
 15 #define SIZE 100000005
 16 
 17 const int N = 100000005;
 18 int m_next[N];
 19 char S[N],T[N];
 20 int slen, tlen;
 21 
 22 void getNext()
 23 {
 24     int j, k;
 25     j = 0; k = -1; m_next[0] = -1;
 26     while(j < tlen)
 27         if(k == -1 || T[j] == T[k])
 28             m_next[++j] = ++k;
 29         else
 30             k = m_next[k];
 31 
 32 }
 33 /*
 34 返回模式串T在主串S中首次出现的位置
 35 返回的位置是从0开始的。
 36 */
 37 int KMP_Index()
 38 {
 39     int i = 0, j = 0;
 40     getNext();
 41 
 42     while(i < slen && j < tlen)
 43     {
 44         if(j == -1 || S[i] == T[j])
 45         {
 46             i++; j++;
 47         }
 48         else
 49             j = m_next[j];
 50     }
 51     if(j == tlen)
 52         return i - tlen+1;
 53     else
 54         return -1;
 55 }
 56 /*
 57 返回模式串在主串S中出现的次数
 58 */
 59 int KMP_Count()
 60 {
 61     int ans = 0;
 62     int i, j = 0;
 63 
 64     if(slen == 1 && tlen == 1)
 65     {
 66         if(S[0] == T[0])
 67             return 1;
 68         else
 69             return 0;
 70     }
 71     getNext();
 72     for(i = 0; i < slen; i++)
 73     {
 74         while(j > 0 && S[i] != T[j])
 75             j = m_next[j];
 76         if(S[i] == T[j])
 77             j++;
 78         if(j == tlen)
 79         {
 80             ans++;
 81             j = m_next[j];
 82         }
 83     }
 84     return ans;
 85 }
 86 int main()
 87 {
 88     
 89     int TT;
 90     int i, cc;
 91     string str;
 92     cin>>TT;
 93     while(TT--)
 94     {
 95         getchar();
 96     
 97         scanf("%s %s",&T,&S);
 98         slen = strlen(S);
 99         tlen = strlen(T);
100         printf("%d\n",KMP_Count());
101         
102         //cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()/2+1<<endl;
103         //cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl;
104     }
105     return 0;
106 }

 

posted @ 2016-07-21 14:43  pter  阅读(103)  评论(0编辑  收藏  举报