Cod sursa(job #2675261)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 21 noiembrie 2020 11:44:34
Problema Prefix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

ifstream f("prefix.in");
ofstream g("prefix.out");

char pattern[2000005];
int prefix[2000005], n;

void read()
{
    f.getline(pattern+1, 2000005);
    n = strlen(pattern+1);
    memset(prefix, 0, sizeof(prefix));
}

void calcPrefix()
{
    int j = 0;
    for(int i = 2; i <= n; i++)
    {
        while(j > 0 && pattern[i] != pattern[j+1])
        {
            j = prefix[j];
        }
        if(pattern[i] == pattern[j+1])
        {
            prefix[i] = j+1;
            j++;
        }
    }
}

int findMaxPref()
{
    int j = 0;
    for(int i = n; i >= 1; i--)
    {
        if(prefix[i] != 0)
        {
            int l = i - prefix[i];
            int j = prefix[i];
            while(prefix[j] != 0)
            {
                if(j - prefix[j] != l)
                    break;
                j = prefix[j];
            }
            if(j == l)
            {
                return i;
            }
        }
    }
}

void afisare()
{
    for(int i = 1; i<=n; i++)
        g<<prefix[i]<<" ";
    g<<"\n";
}

int main()
{
    int T;
    f>>T;
    f.get();
    for(int i = 0; i<T; i++)
    {
        read();
        calcPrefix();
        //afisare();
        g<<findMaxPref()<<"\n";
    }
    return 0;
}