推荐一篇dalao的博客:wind_whisper qwq特别有帮助
题解
题解
神题!!!能够大大加深对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;
}