Cod sursa(job #73869)

Utilizator vlad_popaVlad Popa vlad_popa Data 21 iulie 2007 13:44:49
Problema Prefix Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
using namespace std;

#include <cstdio>
#include <cassert>
#include <string>
#include <sstream>
#include <algorithm>
#include <iostream>

#define FIN "prefix.in"
#define FOUT "prefix.out"
#define NMAX 1000001
#define CLEAR(X) memset ((X), 0, sizeof(X))

string a, sir;
int N, pi[NMAX];

void prefix ()
{
    int k = 0;
    
    for (int i = 2; i <= N; ++ i)
    {
        while (k > 0 && a[k + 1] != a[i])
            k = pi[k];

        if (a[k + 1] == a[i])
            ++ k;
        pi[i] = k;
    }
}

void solve ()
{
     CLEAR (pi);
     
     prefix ();
     
     /*for (int i = 1; i <= N; ++ i)
         printf ("%d ", pi[i]);
     printf ("\n");*/ 
     //cout << a;
     //printf ("% d\n", N);   
     
     int K;
     for (K = N; K >= 1; -- K)
         if (pi[K] > 0 && K % (K - pi[K]) == 0)
            break;
            
     printf ("%d\n", K);               
}

void read ()
{
     int T;
     scanf ("%d\n", &T);
     
     while (T--)
     {
           cin >> sir;
           a = " " + sir;
           
           N = sir.size ();
           
           solve ();
     }
}

int
 main ()
{
      freopen (FIN, "rt", stdin);
      freopen (FOUT, "wt", stdout);
      
      read ();
      
      return 0;
}