poj1961 Period
毒瘤题。
我可不是在说这个题目毒瘤,我是在说编译和评测毒瘤...
它不用函数抽象出求next就会T,用了函数就A了,让我怀疑poj的评测机歧视我。
以及之前一题用函数就WA,不用就A,实在是...
我们仔细分析题目,发现在每个i处若(i + 1)能被(i - j)整除就ok
然后就随手敲代码出来咯,然后被poj的神奇网络卡了几天...
1 #include <cstdio> 2 const int N = 1000010; 3 /// poj 1961 4 /// Period 5 int nex[N], n; 6 char s[N]; 7 inline void getnext() { 8 nex[0] = 0; 9 for(int i = 1, j = 0; i < n; i++) { 10 while(j && s[i] != s[j]) { 11 j = nex[j - 1]; 12 } 13 if(s[i] == s[j]) j++; 14 nex[i] = j; 15 } 16 return; 17 } 18 int main() { 19 int T = 0;; 20 while(scanf("%d", &n)) { 21 if(!n) break; 22 scanf("%s", s); 23 printf("Test case #%d\n", ++T); 24 //printf("%s ", s); 25 getnext(); 26 for(int i = 2; i <= n; i++) { 27 int j = nex[i - 1]; 28 if(j && (i % (i - j) == 0)) { 29 printf("%d %d\n", i, i / (i - j)); 30 } 31 } 32 puts(""); 33 } 34 return 0; 35 }