ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

YbtOJ KMP算法课堂过关 例4 子串拆分【KMP】

2021-03-20 12:03:26  阅读:220  来源: 互联网

标签:子串 nxt zn lo int YbtOJ 20010 KMP


在这里插入图片描述


思路

这道题首先可以发现要找最大字符串的子串来看是否有ABA型,然后直接超时,发现可以直接枚举左端点,大的子串可以包含小的右端点子串。于是枚举每一个左端点,然后求next,把这个子串中所有ABA找出来,然后找的过程也可以用 k = n e x t [ k ] k=next[k] k=next[k] 来找,当然一个ABA还要满足题目中的两个条件才行。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int lo,nxt[20010],nxt2[20010];
char s[20010],zn[20010];
int ans;
int main()
{
	scanf("%s",s+1);
	cin>>lo;
	int longs=strlen(s+1);
	for(int i=1; i<=longs; i++)
     {
		memset(nxt,0,sizeof(nxt));
     	memset(zn,0,sizeof(zn));
     	for(int j=1; i+j-1<=longs; j++)
     	   zn[j]=s[i+j-1];
     	int k=0,longzn=strlen(zn+1);
     	for(int j=2; j<=longzn; j++)
     	 {
     	 	while(k>0&&zn[k+1]!=zn[j])
     	 	  k=nxt[k];
     	 	if(zn[k+1]==zn[j])
     	 	  k++;
     	 	nxt[j]=k;
		 }
		k=0;
		for(int j=2; j<=longzn; j++)
		 {
		 	while(k>0&&zn[k+1]!=zn[j])
		 	  k=nxt[k];
		 	if(zn[k+1]==zn[j])
		 	  k++;
		 	while(k*2>=j)
		 	  k=nxt[k];
		 	if(k>=lo)
		 	  ans++;
		 }
	 }
	cout<<ans; 
	return 0;
}

标签:子串,nxt,zn,lo,int,YbtOJ,20010,KMP
来源: https://blog.csdn.net/Jackma_mayichao/article/details/115025045

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有