Pagini recente » Cod sursa (job #2251958) | Cod sursa (job #1829227) | Cod sursa (job #1730220) | Cod sursa (job #3210021) | Cod sursa (job #1876611)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("prefix.in");
ofstream out("prefix.out");
const int NMax = 1000000 + 5;
int T,N;
char str[NMax];
int pf[NMax];
// str - sirul citit
// pf - functia prefix care se genereaza pentru algoritmul KMP
int main() {
in>>T;
while (T--) {
in>>(str+1);
N = strlen(str+1);
// se construieste pf
int k = 0;
pf[1]=0;
for (int i=2;i<=N;++i) {
while (str[i]!=str[k+1] && k>0) {
k = pf[k];
}
if (str[i]==str[k+1]) {
++k;
}
pf[i] = k;
}
bool found = false;
for (int i=N;i>0;--i) {
if (pf[i]==0) {
continue;
}
// daca am un sufix maximal in i care e prefix al sirului,
// atunci, datorita modului in care se construieste functia pf si ce inseamna aceasta,
// prefixul de lungime p incepe sa se repete periodic de la pozitia i-pf[i]+1.
// daca este si divizor al sufixului maximal, inseamna ca prefixul p se repeta complet,
// fara sa se termine prematur, adica i = p + p + ... + p
int p = i - pf[i];
if (pf[i]%p==0) {
found = true;
out<<i<<'\n';
break;
}
}
if (!found) {
out<<0<<'\n';
}
}
in.close();out.close();
return 0;
}