不難發現結論pe
ri=i
−nex
ti,nex
t 就是kmp裡的失配陣列。
考慮構造乙個字串
s 滿足上述ne
xt陣列,定義
i 的失配集為∪n
exti
−1+1
的失配集。若ne
xti>
0 則si
=sne
xti ,若ne
xti=
0 則
i 必須和其失配集中的字元互不相同,因為字典序要最小,於是si
為其中未出現過的最小字元,又因為失配集的層層包含關係,所以等價於其中出現過的最大字元+1
。 **:
#include
#include
using
namespace
std;
const
int maxn=100010;
int n,fail[maxn],ans[maxn];
int main()
fail[0]=-1;
for(int i=1;i<=n;i++)
if(fail[i]) ans[i]=ans[fail[i]];
else
for(int p=fail[i-1];p>=0;p=fail[p]) ans[i]=max(ans[i],ans[p+1]+1);
for(int i=1;i<=n;i++)
printf("%c",ans[i]+'a');
return
0;}
KMP 字串 BZOJ4974字串大師
在kmp演算法中,fai lfail fail 指標有乙個特殊的性質,i f aili i fail i i fail i 是前i個字元的最小迴圈節大小。所以這題相當於就是說,給了你每個點的fail指標,求乙個滿足的字串。那麼按照建fail指標的方式倒過來做就好了 include include i...
4974 字串大師
description 乙個串t是s的迴圈節,當且僅當存在正整數k,使得s是t k 即t重複k次 的字首,比如abcd是abcdabcdab的迴圈節 給定乙個長度為n的僅由小寫字元構成的字串s,請對於每個k 1 k n 求出s長度為k的字首的最短迴圈節的 長度per i。字串大師小q覺得這個問題過於...
BZOJ4947 字串大師 KMP
time limit 1 sec memory limit 256 mb submit 739 solved 358 submit status discuss 乙個串t是s的迴圈節,當且僅當存在正整數k,使得s是t k 即t重複k次 的字首,比如abcd是abcdabcdab的迴圈節 給定乙個長度...