Cod sursa(job #2307039)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 23 decembrie 2018 16:46:55
Problema Prefix Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <cstdio>
#include <string>

#define MAXN 1000000

using namespace std;

string s;
int z[MAXN + 5];

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

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() {
    int t;
    FILE *fin = fopen ( "prefix.in", "r" );
    fscanf ( fin, "%d", &t );

    char c = fgetc ( fin );

    FILE *fout = fopen ( "prefix.out", "w" );
    while ( t ) {
        c = fgetc ( fin );
        s.clear();
        do {
            s += c;
            c = fgetc ( fin );
        } 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 );
        fprintf ( fout, "%d\n", ans );
        t--;
    }

    fclose ( fin );
    fclose ( fout );

    return 0;
}