kmp

https://vjudge.net/contest/227956#problem/A

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int next[10000050];
char s[10000050];
void cal_next(int len,char a[])
{
	next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
	int j=-1;//k初始化为-1
	for(int i=1;i<len;i++)
	{
		while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
		{
			j=next[j];//往前回溯
		}
		if(a[i]==a[j+1])//如果相同,j++
		j=j+1;
		next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
	 } 
}
int main()
{
	while(scanf("%s",s)&&s[0]!='.')
	{
		getchar();
		int len=strlen(s);
		//int ans=1;
		cal_next(len,s);
	//	for(int i=0;i<len;i++)
	  //  printf("%d ",next[i]);
		if(len%(len-next[len-1]-1)==0)
		printf("%d
",len/(len-next[len-1]-1));
		else
		printf("1
");
	}
	return 0;
}

  

https://vjudge.net/contest/227956#problem/B

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int next[10000050];
char s[10000050];
void cal_next(int len,char a[])
{
	next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
	int j=-1;//k初始化为-1
	for(int i=1;i<len;i++)
	{
		while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
		{
			j=next[j];//往前回溯
		}
		if(a[i]==a[j+1])//如果相同,j++
		j=j+1;
		next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
	 } 
}
int main()
{
	while(scanf("%s",s)&&s[0]!='.')
	{
		getchar();
		int len=strlen(s);
		//int ans=1;
		cal_next(len,s);
	//	for(int i=0;i<len;i++)
	  //  printf("%d ",next[i]);
		if(len%(len-next[len-1]-1)==0)
		printf("%d
",len/(len-next[len-1]-1));
		else
		printf("1
");
	}
	return 0;
}

  

https://vjudge.net/contest/227956#problem/E

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char s[1000050],p[10050];
int next[10050];
void cal_next(char a[],int len)
{
	next[0]=-1;
	int k=-1;
	for(int i=1;i<len;i++)
	{
		while(k>-1&&a[i]!=a[k+1])
		k=next[k];
		if(a[i]==a[k+1])
		k++;
		next[i]=k;
	}
}
int kmp(char a[],int len1,char b[],int len2)
{
	int k=-1,ans=0;
	for(int i=0;i<len1;i++)
	{
		while(k>-1&&a[i]!=b[k+1])
		k=next[k];
		if(a[i]==b[k+1])
		k++;
		if(k==len2-1)
		{
			ans++;
			k=next[k];
		}
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		int ans=0;
		scanf("%s",p);
		getchar();
		scanf("%s",s);
		getchar();
		int len1=strlen(p);
		int len2=strlen(s);
		cal_next(p,len1);
		ans=kmp(s,len2,p,len1);
		printf("%d
",ans);
	}
	return 0;
}

  

当初的梦想实现了吗,事到如今只好放弃吗~
原文地址:https://www.cnblogs.com/caijiaming/p/9097192.html