Cod sursa(job #2068660)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 18 noiembrie 2017 10:17:21
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <cstring>

using namespace std;

char s[1000005];
int n, pre[1000005];

void buildPre() {
    int len = 0, i = 1;
    while(i < n) {
        if(s[len] == s[i]) {
            ++ len;
            pre[i] = len;
            ++ i;
        } else {
            if(len == 0) {
                pre[i] = 0;
                ++ i;
            } else {
                len = pre[len - 1];
            }
        }
    }
}

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

    int t;
    scanf("%d\n", &t);

    while(t --) {
        gets(s);
        n = strlen(s);
        buildPre();

        int rasp = 0;
        for(int p = n / 2; p >= 1; -- p) {
            int apar = 0, poz = p + p - 1;
            while(poz < n && pre[poz] == (apar + 1) * p) {
                ++ apar;
                poz += p;
            }
            if(apar > 0 && rasp < (apar + 1) * p) {
                rasp = (apar + 1) * p;
            }
        }

        printf("%d\n", rasp);
    }

    return 0;
}