BZOJ4974 字串大師

2021-08-14 08:30:54 字數 813 閱讀 3443

不難發現結論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的迴圈節 給定乙個長度...