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陣列表示的是...