其他分享
首页 > 其他分享> > 1469:似乎在梦中见过的样子

1469:似乎在梦中见过的样子

作者:互联网

题干解析

具体思路

代码

//  jqsh 2021.4.6 22:43
#include<bits/stdc++.h>
using namespace std;
int n,m,p[150007],ans;
char a[200007];
void pre(){ //话说我为啥要用函数?
	for(int k=1;k<=n-(m<<1);k++){ //枚举
		int j=k-1;
		for(int i=k;i<=n;i++) p[i]=k-1;
		for(int i=k+1;i<=n;i++){// KMP
			while(j>k-1&&a[i]!=a[j+1]) j=p[j];
			if(a[i]==a[j+1]) j++;
			p[i]=j;
			// 这段是被屏蔽的那段,如不改,会超时。
			int t=j; 
			while(t-k+1>=i-t) t=p[t]; //保证中间有空
			if(t-k+1>=m) ans++; //达到要求,累加
		}
	/*	j=k-1; 这段单独开会超时
		for(int i=k+1;i<=n;i++){
			while(j>k-1&&a[i]!=a[j+1]) j=p[j];
			if(a[i]==a[j+1]) j++;
			while(j-k+1>=i-j) j=p[j];
			if(j-k+1>=m) ans++;
		}	*/
	}
	return;
}
int main(){
	scanf("%s",a+1);
	scanf("%d",&m);
	n=strlen(a+1);
	pre();
	printf("%d\n",ans);
	return 0;
}

标签:int,KMP,++,while,1469,ans,字符串,样子,梦中见
来源: https://blog.csdn.net/jqsh_/article/details/115473079