Cod sursa(job #2306452)

Utilizator filicriFilip Crisan filicri Data 22 decembrie 2018 13:14:43
Problema Prefix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <string>
#include <vector>
#define lim 1000004
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
int t,pre[lim],lm,maxim;
string s;
vector <int> fr[lim];
void prefix (void)
{
    int j=0;
    for (int i=2;i<=s.length();i++)
    {
        while (j && s[j+1]!=s[i]) j=pre[j];
        if (s[j+1]==s[i]) j++;
        pre[i]=j;
    }
}
int main()
{
    f>>t;
    while (t--)
    {
        f>>s;
        int ns=s.length();
        maxim=0;
        for (int i=ns-1;i>=0;i--) s[i+1]=s[i];
        for (int i=1;i<=ns;i++) pre[i]=0;
        prefix();
        for (int l=1;l<ns;l++)
        {
            int j=0;
            for (int i=l+1;i<=ns;i++)
            {
                while (j && s[j+1]!=s[i]) j=pre[j];
                if (s[j+1]==s[i]) j++;
                if (j==l)
                {
                    j=pre[j];
                    fr[l].push_back(i);
                }
            }
        }
        for (int l=1;l<ns;l++)
        {
            int verif=2*l,ok=1,currmax=0,hasfr=0;
            for (auto i:fr[l])
            {
                hasfr=1;
                if (i!=verif)
                {
                    ok=0;
                    break;
                }
                verif+=l;
            }
            verif-=l;
            if (hasfr)
            {
                if (verif>maxim) maxim=verif;
            }
            fr[l].clear();
        }
        g<<maxim<<'\n';
    }
    f.close();
    g.close();
    return 0;
}