POJ 1961
阿新 • • 發佈:2018-11-11
.。。雖然 POJ 還沒好。。但是我感覺這個程式碼能A。。。如果有錯誤。。我再改
題目大概:
給一個長度為 n 的字串, 問題是輸出 第 i 個字母字首。。重複出現了幾次(一言難盡。。舉例吧)
例如樣例中 12 aabaabaabaab
先輸出的 2 2 代表 第二個字母 a 出現了兩次了 因為 第一個是 a 第二個還是 a 這就是一個小的迴圈節
之後的 6 2 代表 到第六位時候 aab 這個組合出現過 2 次了。。
而 9 3 代表 aab 出現 3次
12 4 。。就不用說了吧。。
總而言之,就是求並輸出字元裡所有 0--i 子字元裡 迴圈節個數。。和出現迴圈節的 i 。。
(懂那個意思就好。。)
都說這題就是 2406 改良版。。。現在一看。。確實不假。。
以下為感覺可以AC的程式碼(POJ。。502了)
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> using namespace std; const int maxn = 1e6 + 5; int nex[maxn]; char str[maxn]; void getnex(char *str) { int len =strlen(str); int i=0,j=-1; nex[0]=-1; while(i<len) { if(j==-1 || str[i]==str[j]) nex[++i]=++j; else j=nex[j]; } } int main() { int leng; int cnt = 1; while(~scanf("%d",&leng) && leng) { scanf("%s",str); getnex(str); printf("Test case #%d\n", cnt++); for(int i=1;i<=leng;i++) { int l = i - nex[i]; if(i != l && i % l == 0) { printf("%d %d\n",i , i/l); } } } return 0; }