Cod sursa(job #2304982)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 18 decembrie 2018 22:01:53
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <cstdio>
#include <string>

#define MAXN 1000000

using namespace std;

string s;
int z[MAXN+5];

const int BUFF=4096;
int curs=4095;
char buff[BUFF];

char nextch( )
{
  curs++;

  if( curs==BUFF )
  {
    curs=0;
    fread(buff,1,BUFF,stdin);
  }

  return buff[curs];
}

char getch( )
{
  char c=nextch();

  while( c==' ' )
    c=nextch();

  return c;
}

inline int maxim( int a, int b )
{
  if( a<b )
    a=b;

  return a;
}

inline void zet( )
{
  z[0]=s.size();

  int st=0, dr=0;

  for( int i=1;i<s.size();i++ )
  {
    z[i]=z[i-st];

    if( i+z[i]>=dr )
    {
      z[i]=maxim(0,dr-i);

      st=i;
      dr=i+z[i];
    }

    while( i+z[i]<s.size() && s[z[i]]==s[i+z[i]] )
    {
      z[i]++;
      dr++;
    }
  }
}

int main()
{
  freopen( "prefix.in", "r", stdin );
  freopen( "prefix.out", "w", stdout );

  int t;

  cin>>t;

  char c=getch();

  while( t )
  {
    c=getch();
    s.clear();

    do
    {
      s+=c;

      c=getch();
    }
    while( c!='\n' );

    zet();

    int ans=0;

    for( int i=1;i<s.size();i++ )
      if( z[i]>=i )
        ans=maxim(ans,i+z[i]-z[i]%i);

    cout<<ans<<endl;

    t--;
  }

  return 0;
}