记录编号 94085 评测结果 AAA
题目名称 [POJ 3461] 乌力波 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.168 s
提交时间 2014-03-30 11:16:39 内存使用 6.04 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std;
const int SIZEL=1000010;
char word[SIZEL],text[SIZEL];
int next[SIZEL]={0};
void getnext(char *s,int n,int *next){//字符串s,文本下标0~n-1,结果存于f
	next[0]=-1;//这是一个特例
	int i=0,j=-1;
	while(i<n){
		while(j!=-1&&s[i]!=s[j]) j=next[j];
		next[++i]=++j;//如果在这个位置失配了应该去哪试图配
	}
}
int KMP(char *S,int n,char *T,int m){//目标串S的前n个中出现了几次模式串T的前m个
	int i=0,j=0;
	int ans=0;
	getnext(T,m,next);
	while(i<n){
		while(j!=-1&&S[i]!=T[j]) j=next[j];
		i++,j++;
		if(j==m) ans++;
	}
	return ans;
}
int main(){
	freopen("oulipo.in","r",stdin);
	freopen("oulipo.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%s%s",word,text);
		printf("%d\n",KMP(text,strlen(text),word,strlen(word)));
	}
	return 0;
}