KMP

KMP模板
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include <vector>

using namespace std;

int m,n;
int ans;
char a[10007],b[10007];
int nex[10007];
void getnext()//求子串的next数组
{
	int i = 1, j = 0;
	while(i < m)
	{
		if(j == 0 && b[i] != b[j])
		{
			nex[i] = 0;
			i ++;
		}
		else if(j > 0 && b[i] != b[j])
			j = nex[j-1];
		else
		{
			nex[i] = j + 1;
			i ++; 
			j ++;
		}
	}
}
int kmp()
{
	int i = 0,j = 0;
	while(i < n && j < m)
	{
		if(j == 0 && a[i] != b[j])
			i ++;
		else if(j > 0 && a[i] != b[j])
			j = nex[j-1];
		else
		{
			i ++; 
			j ++;
		}//查找相同部分
		if(j == m)
		{
			ans++;
			j=0;//求不重叠的子串个数,若判断有没有子串,直接输出ans,若重叠的子串个数,不用对j赋值,输出ans,若输出起始位置,i-j+1;
		}
	}
		return ans;
}
int main()
{
	while(~scanf("%s",&a)&&a[0]!='#')
	{
		scanf("%s",&b);
		ans=0;
		m=strlen(b);
		n=strlen(a);
		getnext();
		kmp();
		printf("%d\n",ans);
	}
	return 0;
}


全部评论
你这自己都有(滑稽
点赞 回复 分享
发布于 2019-12-12 13:22

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务