Cod sursa(job #390466)

Utilizator vladiiIonescu Vlad vladii Data 3 februarie 2010 20:13:58
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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, j, 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;
}