連結:
http://acm.hdu.edu.cn/showproblem.php?pid=3746
題目大意:
給定一個字串T, 在T後面添加x個字串(讓x最小),使得新字串由首碼字串至少迴圈兩次構成的。
例如,
abca, 只需要再添加2個字母bc, 形成abcabc,就變成了由abc迴圈兩次構成的。
分析與總結:
失配函數構造next數組的性質的應用,需要對這個有真正的理解。
對於長度為len的字串,假設已經夠造完了next數組,那麼len-next[len]就是這個字串的最小迴圈節。
如果正好len%(len-next[len])==0就說明正好組成完成的迴圈。
否則,說明還需要再添加幾個字母才能補全。
需要補的個數是迴圈個數len-next[len]-f[len]%(len-next[len]).
f[len]%(len-next[len])表示在最後一個迴圈節中已經構造了這麼多個數。
代碼:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 100005;char T[MAXN];int f[MAXN];void getFail(char* p,int* f){ int n=strlen(p); f[0]=f[1]=0; for(int i=1; i<n; ++i){ int j=f[i]; while(j && p[i]!=p[j]) j=f[j]; f[i+1] = p[i]==p[j]?1+j:0; }}int main(){ int nCase; scanf("%d",&nCase); while(nCase--){ scanf("%s",T); int len=strlen(T); getFail(T, f); if(f[len] && len%(len-f[len])==0){ puts("0"); } else{ int ans=(len-f[len])-f[len]%(len-f[len]); printf("%d\n",ans); } } return 0;}
—— 生命的意義,在於賦予它意義士。
原創 http://blog.csdn.net/shuangde800 , By
D_Double (轉載請標明)