description
乙個串t是s的迴圈節,當且僅當存在正整數k,使得s是t^k(即t重複k次)的字首,比如abcd是abcdabcdab的迴圈節
。給定乙個長度為n的僅由小寫字元構成的字串s,請對於每個k(1<=k<=n),求出s長度為k的字首的最短迴圈節的
長度per_i。字串大師小q覺得這個問題過於簡單,於是花了一分鐘將其ac了,他想檢驗你是否也是字串大師。
小q告訴你n以及per_1,per_2,…,per_n,請找到乙個長度為n的小寫字串s,使得s能對應上per。
input
第一行包含乙個正整數n(1<=n<=100000),表示字串的長度。
第二行包含n個正整數per_1,per_2,…per_n(1<=per_i<=i),表示每個字首的最短迴圈節長度。
輸入資料保證至少存在一組可行解。
output
輸出一行乙個長度為n的小寫字串s,即某個滿足條件的s。
若有多個可行的s,輸出字典序最小的那乙個。
sample input
1 2 2 2 5
sample output
ababb
我們可以觀察到乙個性質next[i]=i-p[i]
知道了這個就很好做了
對於p[i]!=i的情況,%一下就好了
否則,按next來跳,將每個到的位+1的字母標為不能選。。
最後選最小就好
code:
#include
#include
const
int n=100005;
int n;
int a[n];
char ss[n];
int f[n];
int mod (int x,int y)
bool vis[27];
void solve ()
for (int i=0;i<=26;i++)
if (vis[i]==false)}}
}int main()
solve();
for (int u=1;u<=n;u++) printf("%c",ss[u]);
return
0;}
BZOJ4974 字串大師
不難發現結論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 必須和其失配集中的字元互不相同,因為字典序要最小,...
KMP 字串 BZOJ4974字串大師
在kmp演算法中,fai lfail fail 指標有乙個特殊的性質,i f aili i fail i i fail i 是前i個字元的最小迴圈節大小。所以這題相當於就是說,給了你每個點的fail指標,求乙個滿足的字串。那麼按照建fail指標的方式倒過來做就好了 include include i...
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的迴圈節 給定乙個長度...