Pagini recente » Cod sursa (job #887303) | Cod sursa (job #468118) | Cod sursa (job #1078139) | Cod sursa (job #2805293) | Cod sursa (job #599135)
Cod sursa(job #599135)
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1000005;
char s[N];
int t, L[N];
inline int prefix(){
int v, k, n = strlen(s), i, max = 0;
L[1] = 0;
for(i = 2; i <= n; ++i){
k = L[i - 1];
while(k && s[k] != s[i - 1])
k = L[k];
if(s[k] == s[i - 1])
++k;
L[i] = k;
// printf("%d %d\n", i, k);
v = i;
while(k && 2 * L[v] >= v){
if(2 * L[v] == v)
max = i;
v = L[v];
}
}
return max;
}
int main() {
ifstream fin("prefix.in");
ofstream fout("prefix.out");
int i;
fin >> t;
for(i = 1; i <= t; ++i) {
fin >> s;
// printf("%s\n", s);
fout << prefix() << '\n';;
}
return 0;
}