Cod sursa(job #1563541)

Utilizator serbanSlincu Serban serban Data 6 ianuarie 2016 11:02:32
Problema Prefix Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int pi[1000000];

int main()
{
    freopen("prefix.in", "rt", stdin);
    freopen("prefix.out", "wt", stdout);

    int T; cin >> T;
    for(int o = 1; o <= T; o ++) {
        int mx = 0; char s[1000100];
        scanf("%s\n", s + 1); int n = strlen(s + 1);

        int k = 0;
        for(int i = 2; i <= n; i ++) {
            while(k && s[i] != s[k + 1]) k = pi[k];
            if(s[i] == s[k + 1]) k ++;
            pi[i] = k;
        }

        for(int i = n; i >= 1; i --) {
            k = 1; bool enter = false, ok = true; int pr = i, dif = i - pi[i];
            pr = pi[pr];
            while(pr && pi[pr] && ok) {
                if(pr != dif) {
                    enter = true;
                    if(pr && pi[pr]) {
                        if(dif != (pr - pi[pr])) ok = false;
                    }
                    k ++;
                    pr = pi[pr];
                }
                else break;
            }
            if((enter && ok && pr == dif) || (!enter && pr == dif)) {
                k ++;
                if(dif != n)
                    mx = max(mx, k * dif);
            }
        }

        for(int i = 2; i <= n; i ++)
            pi[i] = 0;
        cout << mx << "\n";
    }
    return 0;
}