Cod sursa(job #2524749)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 16 ianuarie 2020 10:45:17
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int NMAX = 1000005;

char s[NMAX];
int z[NMAX];

int main(){
    freopen("prefix.in","r",stdin);
    freopen("prefix.out","w",stdout);
    int tests;
    scanf("%d\n",&tests);
    for(;tests;tests--){
        scanf("%s",s);
        int n=strlen(s);

        ///make z function
        z[0]=0;
        for(int k=1,st=0,dr=0;k<n;++k){
            if(k>dr){
                st=dr=k;
                while(dr<n && s[dr]==s[dr-st])
                    dr++;
                z[k]=dr-st;
                dr--;
            }else{
                if(k+z[k-st]<=dr)
                    z[k]=z[k-st];
                else{
                    st=k;
                    while(dr<n && s[dr]==s[dr-st])
                        dr++;
                    z[k]=dr-st;
                    dr--;
                }
            }
        }
        ///iterate to get answer
        int ans=0;

        for(int i=1;i<n;++i){
            if(z[i]>=i)
                ans=max(ans,(z[i]/i+1)*i);
        }
        printf("%d\n",ans);
    }
    return 0;
}