Cod sursa(job #2060684)

Utilizator anisca22Ana Baltaretu anisca22 Data 8 noiembrie 2017 16:52:20
Problema Prefix Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#define NMAX 2000005
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");

int cnt, t;
int S[NMAX];
char sir[NMAX], key[NMAX];
vector <int> rsp;

void kmp(char sir[], char key[])
{
    int n = strlen(sir + 1);
    int m = strlen(key + 1);

    S[0] = -1;
    S[1] = 0;
    for (int i = 2; i <= m; i++)
    {
        int prv = i - 1;
        char ch = key[i];
        while (S[prv] != -1 && key[S[prv] + 1] != ch)
            prv = S[prv];
        S[i] = S[prv] + 1;
    }

    int lst = 0;
    for (int i = 1; i <= n; i++)
    {
        while (lst != -1)
            if (key[lst + 1] == sir[i])
                break;
            else lst = S[lst];
        lst++;
        if (lst == m)
        {
            if ((rsp.empty() && i - m == 0) || (i - m) == rsp[rsp.size() - 1] + m)
            {
                rsp.push_back(i - m);
                lst = S[lst];
            }
            else break;
        }
    }
}

int main()
{
    fin >> t;
    while (t--)
    {
        fin >> (sir + 1);
        int n = strlen(sir + 1);
        int mx = 0;
        for (int i = 1; i <= n / 2; i++)
        {
            rsp.clear();
            strcpy(key + 1, sir + 1);
            strcpy(key + i + 1, "");
            kmp(sir, key);
            if (rsp.size() > 1)
            {
                int m = rsp.size() * strlen(key + 1);
                mx = max(mx, m);
            }
        }
        fout << mx << "\n";
    }
    return 0;
}