Pagini recente » Borderou de evaluare (job #2598324) | Cod sursa (job #90515) | Borderou de evaluare (job #2279822) | Borderou de evaluare (job #10040) | Cod sursa (job #3242905)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
string s;
int pi[N]; // cel mai lung sufix propriu egal cu un prefix
void kmp(string &s, int *pi) {
int k = 0;
for(int i = 1; i < s.length(); i++) {
while(k > 0 && s[i] != s[k]) {
k = pi[k - 1];
}
if(s[i] == s[k]) {
k++;
}
pi[i] = k;
}
}
int z[2 * N];
void Z(string &s, int *z) {
int l = 0, r = 0; // [l, r)
int n = s.length();
for(int i = 1; i < n; i++) {
z[i] = 0;
if(i < r) {
z[i] = min(z[i - l], r - i);
}
while(i + z[i] < n && s[i + z[i]] == s[z[i]]) {
z[i]++;
}
if(i + z[i] > r) {
l = i;
r = i + z[i];
}
}
}
// #define HOME
int main() {
#ifndef HOME
ifstream cin("prefix.in");
ofstream cout("prefix.out");
#endif
int n;
string s;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> s;
kmp(s, pi);
int n = s.length();
int res = 0;
for(int i = 1; i <= n; i++) {
if(pi[i - 1] > 0 && i % (i - pi[i - 1]) == 0)
res = i;
}
cout << res << "\n";
}
return 0;
}