【ybtoj】【kmp】字符串题

推荐一篇dalao的博客:wind_whisper qwq特别有帮助

题解

【ybtoj】【kmp】字符串题

题解

神题!!!能够大大加深对KMP的理解qwq

循环节的常用结论:nxt[i] = i - pre[i] (画画图就能推出来)

对于每一个 nxt[i] 分类讨论:

p[i]>0:

此时 s[i] = s[p[i]]

p[i]=0:

我们首先要明白p[i]=0是怎么得到的
因为kmp计算里的那个while语句始终成立,也就是s[i+1]!=s[j+1],导致j一直跳失配跳到了0
所以当前这一位只要和往前跳的那些不同就可以了
注意如果这个i不是第一位的话,它也应该是与第1位不同的(因为while循环里不会讨论到第一位的情况),同时第一位随便填,所以默认填 ‘a’字符

代码

字符串题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N = 1e5+10;
int n,nxt[N],pre[N];
bool vis[30];
char s[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	
	{
		scanf("%d",&pre[i]);
		nxt[i]=i-pre[i];
		if(nxt[i]) s[i]=s[nxt[i]]; 
		else 
		{
			int now=nxt[i-1];
			memset(vis,0,sizeof(vis));	
			while(now)
			{
				vis[s[now+1]-'a']=1;
				now=nxt[now];
			}
			if(i!=1) vis[0]=1; 
			for(int j=0;j<26;j++)	
				if(!vis[j]) {s[i]='a'+j;break;}
		}
	}
	printf("%s",s+1);
	return 0;
}
上一篇:Tomcat启动失败或被强制终止


下一篇:Linux 查看CPU信息、机器型号等硬件信息