文章目錄
1. 題目描述
1.1. Limit
Time Limit: C/C++ 1秒,其他語言2秒
Memory Limit: C/C++ 262144K,其他語言524288K
1.2. Problem Description
有一個字符串 ,對於字符串中一個非前綴子串恰好爲字符串的前綴我們稱之爲ac串。
請問給出一個字符串他的ac串最大長度爲多少。
1.3. Input
輸入數據第一行是 ,表示數據的組數,接下來每組數據輸入一個字符串 。
1.4. Output
輸出最大長度
1.5. Sample Input
2
aaaaa
abacc
1.6. Sample Output
4
1
1.7. Note
aaaab的ac串是aaa(2:4)
acac的ac串是ac(3:4)
1.8. Source
2. 解讀
我們有了一個輸入字符串 ,設其非前綴子串爲 , ,其中 爲字符串 的長度, 爲左閉右開區間。這道題目想要求的是最大長度的非前綴子串 ,滿足 。
這恰好就類似於 KMP算法 中 數組 的定義。
其中 表示我們要判斷的是字符串 的長度爲 的子串 , 表示 的前 個字符組成的子串與後 個字符組成的非前綴子串相等,即
例如 aaaab
的 數組爲 ,題目要求的ac串就是 數組中的最大值對應的字符串,也就是aaa
。
推薦一個 KMP算法的可視化網站,裏面還有各種算法的可視化,可以幫助理解。
3. 代碼
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 1e5 + 1;
int Next[MAXN] = { 0 };
int getNext(string p, int length)
{
Next[0] = 0;
Next[1] = 0;
for (int i = 1; i < length; i++) {
int j = Next[i];
while (j && p[i] != p[j]) {
j = Next[j];
}
Next[i + 1] = (p[i] == p[j]) ? j + 1 : 0;
}
return 0;
}
int main()
{
int t, maxN;
string str;
cin >> t;
while (t--) {
cin >> str;
maxN = 0;
getNext(str, str.size());
for (size_t i = 1; i <= str.size(); i++) {
maxN = max(Next[i], maxN);
}
cout << maxN << endl;
}
}
聯繫郵箱:[email protected]
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公衆號:複雜網絡與機器學習
歡迎關注/轉載,有問題歡迎通過郵箱交流。