PKU 1961 KMP判斷迴圈段位置

2022-07-12 12:54:10 字數 1101 閱讀 7290

/*

基本題意:給乙個字串,如果在前 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 由...