【WikiOI】【P1401】【字符串匹配 】【题解】【KMP】

传送门:

http://www.wikioi.com/problem/1404/

写wa了好久……就是因为get_next的时候手贱加了一句……

#include<iostream>    
#include<string>
#include<cstdio>
using namespace std;   
int cnt[200010];
int next[200010];
char s[200010];
char t[200010];
int n,m,k;
void get_next(){
	next[0]=next[1]=0;
	for(int i=1;i<m;i++){
		int j=next[i];
		while(j&&t[i]!=t[j])j=next[j];
		//if(t[i]==t[j])j++;   就TM多加了这句!! 
		next[i+1]=t[i]==t[j]?j+1:0;
	}
}
void kmp(){
	int j=0;
	get_next();
	for(int i=0;i<n;i++){
		while(j&&s[i]!=t[j])j=next[j];
		if(s[i]==t[j])j++;
		cnt[j]++;
	}
}
int getint(){
	int res=0;
	int ok=0;
	char ch;
	while(1){
		ch=getchar();
		if(ch<='9'&&ch>='0'){
			res*=10;
			res+=ch-'0';
			ok=1;
		}else
			if(ok)break;
	}
	return res;
}
int main()    
{
	n=getint();
	m=getint();
	k=getint();
	scanf("%s%s",s,t);
	kmp();
	for(int i=m;i>0;--i)
		cnt[next[i]]+=cnt[i];
	for(int i=0;i<=m;++i)
		cnt[i]-=cnt[i+1];
	for(int i=1;i<=k;++i)
	{
		int r=getint();
		printf("%d\n",cnt[r]);
	}
  return 0;    
}    


你可能感兴趣的:(KMP)