Cod sursa(job #1936921)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 23 martie 2017 15:52:51
Problema Prefix Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;

int pref[1000005];
char s[1000005];

void prep(int n){
    int i,j;
    j = 0;
    for(i = 2;i <= n;i++){
        while(j != 0 && s[j + 1] != s[i]){
            j = pref[j];
        }
        if(s[j + 1] == s[i]){
            j++;
        }
        pref[i] = j;
    }
}

int main() {
    freopen("prefix.in", "r", stdin);
    freopen("prefix.out", "w", stdout);
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%s", s + 1);
        int n = strlen(s + 1);
        prep(n);
        int i;
        int ans = 0;
        for(i = n;i >= 1;i--){
            if(pref[i] != 0 && i/3 <= pref[i] && pref[i] <= i/2 && (2 * pref[i] == i || pref[i]%(i - 2*pref[i]) == 0)){
                ans = i;
                break;
            }else if(pref[i] != 0 && i%(i - pref[i]) == 0){
                ans = i;
                break;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}