kmp演算法練習 poj 1226 poj 1961

2021-06-05 12:28:05 字數 1890 閱讀 6659

poj 1226

題目大意:給出一組字串,要你求出這些字串的最長公共子串的長度,公共子串可以正序或逆序匹配

解題思路:kmp列舉,列舉第乙個字串的每個子串的正序和逆序,與其餘的字串匹配看是否是其子串,求出最大的子串長度。

這題也可以用字尾樹求,留待後面研究。。。。

#include #include #include using namespace std;

const int maxn = 101;

char str[maxn][maxn];

int next[maxn], rnext[maxn], t, n;

void get_next(int start, int end, bool flag);

bool kmp(int index, int start, int end, bool flag);

int main()

if(cnt == n && ans < l)

ans = l;}}

printf("%d\n", ans);

}return 0;

}void get_next(int start, int end, bool flag)

else

j = next[j];}}

else

else

j = rnext[j];}}

}bool kmp(int index, int start, int end, bool flag)

if(j > end)

return true;

}else

if(j < start)

return true;

}return false;

}

poj 1961

題目大意,給出乙個字串,若1~~i長的子字串,是由幾個相同的字串掛接拼湊而成,從小到大輸出i和重複字串的個數

解題思路,kmp,利用kmp中next陣列的特性,當i字元不匹配時,移到next[i]位置做比較,所以同一字串裡1~~next[i] - 1 和 i - (next[i] - 1) - 1 ~~~i字串是匹配的,求出1~i是否由某個字串連續拼接而成,只要知道i是否能整除next[i]~~~i的長度

如上圖,第一副圖,紅色區域代表字串是匹配的,那麼next[i]~~~i為中間的白色加後面的紅色區域,肯定不能被i整除

第二幅圖是字串第乙個白色區域加綠色區域和 綠色區域加第二個白色區域的字串匹配,根據next陣列的特性1~~next[i] - 1 和 i - (next[i] - 1) - 1 ~~~i字串是匹配的,那麼第一塊綠色區域的字串和前面的白色匹配即1~~k 和 i - (next[i] - 1) - 1 ~  i - (next[i] - 1) - 1 + k -1 匹配。如此推導下去,每塊區域都是相互匹配的即next[i]~i(最後的白色區域)能被i整除

另外一種情況時1~~k和k+1~~i匹配,顯然能被i整除

所以判斷的條件就是是否next[i]~i能被i整除

#include #include #include using namespace std;

const int maxn = 1000010;

char str[maxn];

int next[maxn], n;

void get_next();

int main()

}printf("\n");

test++;

}return 0;

}void get_next()

else

j = next[j];}}

poj1226 kmp 最長公共子串

題目 對於字串a1,a2,an 求乙個最大子串長度,使得它或者它的逆向串在每個串中出現 思路 對於a1串,尋找每乙個子串,與之後n 1個串匹配。子串長度的選取可以優化。include include includeusing namespace std const int maxn 101 bool...

POJ 1226 字尾陣列 或 KMP 或 暴力

簡略題意 出現或反轉後出現在每個字串中的最長字串。先將每個串和自己的反轉串連線起來,隨後將這若干個串連線起來。二分答案,判定就分組看是否有一組字尾在所有原串或者原串的反轉串中出現。include include include include include include using namesp...

poj 3461 kmp演算法詳細解釋

題目鏈結 kmp演算法已經學過好多次了,但每一次都會忘記,因此打算在這裡藉著這一道模板題記錄下自己對kmp演算法的理解 kmp演算法的核心思想可以理解為 利用目標串自身的資訊,來減少匹配次數提高效率 next陣列的引入 next陣列就是用來幫助利用目標串自身的資訊的。我們這裡定義next陣列表示的是...