KMP经典入门题

试着写写题解,不知道以后会不会养成习惯。。。

前一阵子复习KMP,又回去找了几道入门题写写。。。

切水找找1A的感觉orz。以下大致都是一句话+代码的形式。实在是懒。

不过我是复习,本来也没什么好说的。 

hdu 1358 找循环节、求字符串周期,简单题,题面简洁。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
const int sz=1e6+5;
char s[sz];
int fail[sz];
int main()
{
	int cas=0;
	for(;;)
	{	int n,len,i,p;
		scanf("%d",&n); if(n==0) break;
		scanf("%s",s+1); len=strlen(s+1); 
		printf("Test case #%d\n",++cas);
		fail[0]=-1; fail[1]=0;
		for(i=2;i<=len;i++)
		{	p=fail[i-1];
			while(p>=0&&s[p+1]!=s[i]) p=fail[p];
			if(p<0) fail[i]=0;
			else fail[i]=p+1;
			if(fail[i]&&i%(i-fail[i])==0) printf("%d %d\n",i,i/(i-fail[i]));
		}
		printf("\n");
	}
	return 0;
}

诶,还是顺便说下吧,我的KMP是自己学的,不,应该说是自己理解之后按照自己的思路写的。

然后写成了现在这个样子的完全就和很多资料不同了。。

当然主要差别无非就是,我的数组下标从1开始而一般的从0开始,然后我写的是“fail[]”数组而不是“next[]”数组。。。

我自己喜欢就好啦~


hdu 1686 匹配,求出现次数;与POJ3461是完全相同的题目。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
const int sz=1e6+4;
char s1[sz],s2[sz];
int fail[sz];
int main()
{
	int cas; cin>>cas;
	while(cas--)
	{	int len1,len2,i,p;
		scanf("%s%s",s1+1,s2+1);
		len1=strlen(s1+1); len2=strlen(s2+1);
		memset(fail,0,sizeof(fail)); fail[0]=-1;
		for(i=1;i<=len1;i++)
		{	for(p=fail[i-1];p>=0&&s1[p+1]!=s1[i];p=fail[p]);
			if(p<0) fail[i]=0;
			else fail[i]=p+1;
		}
		int ans=0;
		for(i=1,p=0;i<=len2;i++)
		{	for(;p>=0&&s1[p+1]!=s2[i];p=fail[p]);
			if(++p==len1){ans++; p=fail[p];}
		}
		printf("%d\n",ans);
	}
	return 0;
}

这大概就是两道经典入门题吧。。

第一次写博客,第一次发代码,先这样。。。我看看效果。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一道经典KMP 题目: 给定一个文本串 T 和一个模式串 P,求模式串 P 在文本串 T 中出现的次数。 输入格式: 第一行输入整数 n,表示文本串 T 的长度。 第二行输入字符串 T。 第三行输入整数 m,表示模式串 P 的长度。 第四行输入字符串 P。 输出格式: 输出一个整数,表示模式串 P 在文本串 T 中出现的次数。 输入样例: 8 abababab 2 ab 输出样例: 4 这道可以使用 KMP 算法来解决,具体思路是: 1. 首先使用 KMP 算法对模式串 P 进行预处理,得到其 next 数组。 2. 然后在文本串 T 上使用 KMP 算法进行匹配,具体思路是:从文本串 T 的第一个字符开始,依次读入每个字符,如果当前字符与模式串 P 的某个字符不匹配,则根据 next 数组回溯到模式串 P 的某个位置重新开始匹配。 3. 如果在文本串 T 上匹配到了一个完整的模式串 P,则将匹配次数加 1,然后继续从下一个字符开始匹配。 最终匹配次数即为模式串 P 在文本串 T 中出现的次数。 下面是 Python 代码实现: ```python def kmp(text, pattern): n, m = len(text), len(pattern) if m == 0: return 0 next = [0] * m j = 0 for i in range(1, m): while j > 0 and pattern[i] != pattern[j]: j = next[j - 1] if pattern[i] == pattern[j]: j += 1 next[i] = j res = 0 j = 0 for i in range(n): while j > 0 and text[i] != pattern[j]: j = next[j - 1] if text[i] == pattern[j]: j += 1 if j == m: res += 1 j = next[j - 1] return res n = int(input()) text = input().strip() m = int(input()) pattern = input().strip() print(kmp(text, pattern)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值