KMP(模板)

Oulipo

   The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book:
   
    Tout avait Pair normal, mais tout s’affirmait faux. Tout 

avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il
aurait voulu savoir où s’articulait l’association qui l’unissait au
roman : stir son tapis, assaillant à tout instant son imagination,
l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant,
d’un non-dit : la vision, l’avision d’un oubli commandant tout, où
s’abolissait la raison : tout avait l’air normal mais…

   Perec would probably have scored high (or rather, low) in the 

following contest. People are asked to write a perhaps even meaningful
text on some subject with as few occurrences of a given “word” as
possible. Our task is to provide the jury with a program that counts
these occurrences, in order to obtain a ranking of the competitors.
These competitors often write very long texts with nonsense meaning; a
sequence of 500,000 consecutive 'T’s is not unusual. And they never use spaces.
So we want to quickly find out how often a word, i.e., a given string, occurs in a text. More formally: given the alphabet {‘A’, ‘B’, ‘C’, …, ‘Z’} and two finite strings over that alphabet, a word W and a text T, count the number of occurrences of W in T. All the consecutive characters of W must exactly match consecutive characters of T. Occurrences may overlap.

    Input
    
  
   The first line of the input file contains a single number: the

number of test cases to follow. Each test case has the following
format:

    One line with the word W, a string over {'A', 'B', 'C', …, 'Z'}, with 1 ≤ |W| ≤ 10,000 (here |W| denotes the length of the string W).
    One line with the text T, a string over {'A', 'B', 'C', …, 'Z'}, with |W| ≤ |T| ≤ 1,000,000.
   
  

    Output
    
  
   For every test case in the input file, the output should 

contain a single number, on a single line: the number of occurrences of
the word W in the text T.
題意:文本串T,模板串S,查找T中有多少個S;

Kmp(主要是運用next[]數組+查詢的方法)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define lowbits(x) x&(-x)
#define ml root<<1
#define mr root<<1|1
#define LL long long
using namespace std;
const int N=1e6+66;
const int maxn=1e4+44;
char a[N],b[N];
int main()
{
    int next[maxn];
    int t;
    scanf("%d",&t);
    while(t--){
        int lena,lenb,ans=0,i,j=0;
        scanf("%s%s",b+1,a+1);
        lena=strlen(a+1);
        lenb=strlen(b+1);
        for(i=2;i<=lenb;++i){               //next[]數組,最長後綴的前綴;
            while(j>0&&b[j+1]!=b[i]) j=next[j];
            if(b[j+1]==b[i]) j++;
            next[i]=j;
        }
        j=0;
        for(i=1;i<=lena;++i){                  //查詢匹配,利用最長後綴的前綴省去了重複查找;
            while(j>0&&b[j+1]!=a[i]) j=next[j];
            if(b[j+1]==a[i]) j++;
            if(j==lenb) ans++,j=next[j];
        }
        printf("%d\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章