H - Power Strings POJ - 2406

題目傳送(http://poj.org/problem?id=2406):

 

題目描述

定義兩個字符串s1和s2的乘積s1*s2爲將s1和s2連結起來得到的字符串。 
例如:s1="xy",s2="z",那麼s1*s2="xyz"。 
由此可以定義s1的冪次:s1^0="",s1^n=s1*s1^(n-1),n>0。

輸入

輸入包含多組測試數據。 
每組數據由一行構成,包含一個字符串s。 
輸入數據以"."結束。

輸出

對於每組輸入數據輸出一行,找出最大的正整數n,使得存在某個字符串a,s = a^n.

樣例輸入

aaad
aaaa
ababab
.

樣例輸出

1
4
3

數據範圍1≤s的長度≤1,000,000Hint

不要使用cin讀取數據
 
 
代碼如下(改代碼來源於網絡):
 
 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1000005;
char s[maxn];
int next[maxn];

int main() {
while(~scanf("%s", s)&&s[0]!='.'){
next[0] = -1;//初始化
int len = strlen(s);//測長;
int i = 0, j = -1;//初始化;
while(i < len){//保證判斷完最後一個字符跳出;
//這裏本人當時看了很久纔看懂,其實只要帶幾個測試數據跟着代碼走一遍就懂了;
/*
大概就是:i,j都是第幾個字符,輸入的第一個是s[0],所以i初始化爲0,
這裏的比較是後面的與前面的比較,所以j初始化爲-1;
這裏比較是先用next[i]=j來記錄第i個字符與第j個相等;
然後判斷第i個字符與前面第j個字符比較是否相等,若不相等,j復位爲-1;
若相等,接着判斷i+1與j+1是否相等......
由於第一個字符的角標爲0所以這裏是先用 next[i]=j來記錄第i個字符與第j個相等,
這樣的話判斷完最後next[len]就是第一個字符到倒數第二個週期的最後一個字符的長度,
用總長度減去next[len]就是剩下的最後一個週期也就是該字符串的最大週期;
最後用總長度除以最大週期就是結果;
*/
if(j == -1 || s[i] == s[j]) next[++ i] = ++ j;
else j = next[j];
}
if(len % (len - next[len]) == 0) printf("%d\n", len / (len - next[len]));
else printf("1\n");
}
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章