Pagini recente » Cod sursa (job #2909097) | Cod sursa (job #1305759) | Cod sursa (job #2129656) | Cod sursa (job #2308196) | Cod sursa (job #963885)
Cod sursa(job #963885)
#include<cstdio>
#include<vector>
#include<algorithm>
#include<utility>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<ctime>
#define MAX_SIZE 1000005
#define get_min(a,b) ((a)>(b)?(a):(b))
FILE *fin=fopen("prefix.in","r");
FILE *fout=fopen("prefix.out","w");
using namespace std;
typedef vector<int>::iterator IT;
vector<int> Sol;
int tests,len;
int pref[MAX_SIZE];
char sir[MAX_SIZE];
void KMP ( void )
{
pref[1]=0;
int i,q;
for( i = 2 , q = 0 ; i <= len ; ++i )
{
while(q && sir[q+1]!=sir[i])
q=pref[q];
if(sir[q+1] == sir[i] )
++q;
pref[i]=q;
}
}
void Solve ( void )
{
int i;
bool find=false;
for( i = len ; i > 0 && !find ; --i )
{
if( pref[i] && i % ( i- pref[i]) == 0 )
{
Sol.push_back(i);
find=true;
}
}
if( find == false )
Sol.push_back(0);
}
void Write ( void )
{
for( IT it=Sol.begin() ; it != Sol.end() ; ++it )
fprintf(fout,"%d\n",*it);
}
int main ( void )
{
fscanf(fin,"%d",&tests);
for( ; tests > 0 ; --tests )
{
fscanf(fin,"%s",sir+1);
len=strlen(sir+1);
KMP();
Solve();
}
Write();
fclose(fin);
fclose(fout);
return 0;
}