Cod sursa(job #564194)

Utilizator informatician28Andrei Dinu informatician28 Data 26 martie 2011 21:15:24
Problema Prefix Scor 100
Compilator cpp Status done
Runda gr_3 Marime 1.05 kb
#include <iostream>
#include <fstream>
using namespace std;
char S[1000010];
int T, Urm[1000010];
 
int main() {
    FILE *f1=fopen("prefix.in", "r"), *f2=fopen("prefix.out", "w");
   int i, p, s, k, poz;
    char c;
    fscanf(f1, "%d", &T);
    while(T--) {
	fscanf(f1, "%s", S+1);
	fscanf(f1, "%c", &c);
	s=strlen(S+1);
	Urm[1]=0; k=0;
	for(i=2; i<=s; i++) {
	while(k>0 && S[i]!=S[k+1]) {
	k=Urm[k];              }
	if(S[i]==S[k+1]) { k++; }
	
	Urm[i]=k;
         }
         /**
         for(i=1; i<=s; i++) {
              cout<<Urm[i]<<", ";
         }
         **/
         //aflu cea mai lunga perioada
         p=0;
         for(i=2; i<=s; i+=2) {
              if(Urm[i]==(i >> 1)) {
                   p=Urm[i];              }
         }
         poz=0;
         if(p) {
              for(i=2*p; i<=s; i+=p) {
                   if(Urm[i]==i-p) {
                        poz=i;
                   }
              }
         }    
         fprintf(f2, "%d\n", poz);
    }
    fclose(f1); fclose(f2);
    return 0;
}