Pagini recente » Cod sursa (job #1554933) | Cod sursa (job #412640) | Monitorul de evaluare | Cod sursa (job #1506869) | Cod sursa (job #3150586)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <string>
std::ifstream fin("prefix.in");
std::ofstream fout("prefix.out");
std::string str;
std::vector<int> kmp(const std::string& str) {
std::vector<int> ret(str.size(),0);
for (int i = 1; i < str.size(); i++) {
int j = ret[i-1];
while (j&&str[i]!=str[j]) {
j = ret[j-1];
}
j += str[i]==str[j];
ret[i] = j;
}
return ret;
}
void test_case() {
fin >> str;
if (str.size()==1) {
fout << "1\n";
}
std::vector<int> pfx_func = kmp(str);
/*for (const auto& i : pfx_func) {
std::cout << i << " ";
}
std::cout << "\n";*/
int start = 0;
int ret = 0;
for (int i = 0; i < pfx_func.size(); i++) {
if (!pfx_func[i]) {
continue;
}
if (pfx_func[i]==1) {
start = i;
}
if (pfx_func[i]) {
if (pfx_func[i]%start==0) {
ret = std::max(ret,i+1);
}
}
}
fout << ret << "\n";
}
int main() {
int test_cases;
fin >> test_cases;
while (test_cases--) {
test_case();
}
}