poj 字串乘方

2022-06-23 14:15:09 字數 995 閱讀 7348

kmp演算法的解釋:字串匹配的kmp演算法-簡單易懂

點選開啟連結

總時間限制:

3000ms 記憶體限制: 65536kb

描述給定兩個字串a和b,我們定義a*b為他們的連線。例如,如果a=”abc” 而b=”def”, 則a*b=”abcdef”。 如果我們將連線考慮成乘法,一個非負整數的乘方將用一種通常的方式定義:a^0=””(空字串),a^(n+1)=a*(a^n)。

輸入每一個測試樣例是一行可列印的字元作為輸入,用s表示。s的長度至少為1,且不會超過一百萬。最後的測試樣例後面將是一個點號作為一行。

輸出對於每一個s,你應該列印最大的n,使得存在一個a,讓s=a^n

樣例輸入

abcd

aaaa

ababab

.

樣例輸出

1

43

提示

本問題輸入量很大,請用scanf代替cin,從而避免超時。

解題思路:

kmp。直接用stl的模板會超時。

以ababab為例,kmp演算法對應的next陣列為-1,0,0,1,2,3,4(next陣列第len個值),則含有的公共子串最長為len-next[len]=6-4=2,含有的公共子串個數為len/(len-next[len])=6/(6-4)=3;

同理對於ababa,對應的next陣列為-1,0,0,1,2,3,所以含有的公共子串長度為5-3=2,公共子串個數為5/2=2.5,顯然此時不能整除,即這種情況含有的公共子串個數直接記為1。

常用的kmp演算法部分:

void getnext(char s)

else

j=next[j]; }}

int main()

else

} return 0;

}