/*
基本題意:給乙個字串,如果在前 i 位置處滿足連續迴圈a^k(a:單位迴圈段,
k:迴圈個數),則輸出i和k
這題跟pku 2406差不多
yy : kmp 儲存 next[i],如果滿足 i能被單位長度(i - next[i])整除,說明
(i - next[i])是單位迴圈段a,i /(i - next[i])也就是k。
舉兩個例子應該就能理解
例一:
i : 12345678
字串 : abababab
next[i]: 00123456
了後面[next[i]+1,i ] 這一段,不能代表全部是迴圈,可能
中間有的地方跟
你說的迴圈點不一樣?」這種問題的話,
看下面個例子
例二:
i : 1234567
字串 : abcabab
next[i]: 0001200
這個例子中位置6.7就是你想的情況,但next[i] = 0;所以是不可能出現迴圈點的,
而位置4.5即便next[i] != 0,但i不能整除(i - next[i]),所以也不會是迴圈段。
*/**如下
#include #include char s[1000003];int next[1000003];
int len;
void getnext_print()
next[i] = j;
//以下是判斷是否是迴圈點
int l = i - next[i];
if(l == i) continue;
if(i%l == 0) //
printf("%d %d\n",i,i/l); }}
int main()
return 0;
}
poj1961 KMP求迴圈節
又是乙個kmp求迴圈節,只要i i next i 0 i i next i 就說明長度為i時,有i i next i 個迴圈節。為什麼會得到這個?這是由next函式的特性得到的,認真想一下,很容易想明白。如下 include include include includeusing namespac...
POJ 1961 KMP(當前重複次數)
題意 字首重複次數,舉個例子,aaa 2的位置2個a,3的位置3個a abcabcabc 6的位置兩個abcabc,9的位置三個abcabc.思路 kmp基礎題目之一,直接利用的是next陣列的特點,對於當前點i,i next i 表示的是最小重複子串長度,如果 i next i 不等於0,同時i ...
KMP以及next陣列應用 POJ1961
百萬級字串.無從下手,t到死 從網上查到要用kmp。我之前也是看過的,欺負我讀書少麼,kmp與這個題有神馬聯絡。題目分析 該題用到了next陣列,next陣列代表的是 字首 和 字尾 的最長的共有元素的長度 必然小於本身長度 為何用到它可能有些難以理解,慢慢來 從結果逆推,若乙個字串 len n 由...