Cod sursa(job #2518980)

Utilizator marinaoprOprea Marina marinaopr Data 6 ianuarie 2020 20:45:38
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#include <algorithm>

#define NMAX 16500

using namespace std;

FILE *fin = fopen("substr.in", "r");
FILE *fout = fopen("substr.out", "w");

struct perechi {int nr0,nr1,poz;} p[NMAX];

int n,k,i,pwr,prec[16][NMAX],j,contor,inv[NMAX],ans,K;
char sir[NMAX];

bool cmp(perechi x, perechi y)
{
    if(x.nr0 == y.nr0 and x.nr1 == y.nr1)
        return x.poz < y.poz;
    if(x.nr0 == y.nr0)
        return x.nr1 < y.nr1;
    return x.nr0 < y.nr0;
}

int prefix(int p1, int p2)
{
    int ans = 0,i;

    for(i=k; i>=0 and p1<=n-1 and p2<=n-1; --i)
        if(prec[i][p1] == prec[i][p2])
        {
            ans += (1<<i);
            p1 += (1<<i);
            p2 += (1<<i);
        }

    return ans;
}

int main()
{
    fscanf(fin, "%d%d\n", &n,&K);
    fgets(sir, n+2, fin);

    for(i=0; i<=n-1; ++i)
        prec[0][i] = sir[i]-'a';

    for(k=1,pwr=2; pwr/2 < n; ++k,pwr*=2)
    {
        for(i=0; i<=n-1; ++i)
        {
            p[i].nr0 = prec[k-1][i];
            if(i+pwr/2 <= n-1)
                p[i].nr1 = prec[k-1][i+pwr/2];
            else
                p[i].nr1 = -1;
            p[i].poz = i;
        }

        sort(p, p+n, cmp);

        contor = 0;
        i = 0;
        while(i <= n-1)
        {
            prec[k][p[i].poz] = contor;
            j = i+1;
            while(j<=n-1 and p[i].nr0 == p[j].nr0 and p[i].nr1 == p[j].nr1)
            {
                prec[k][p[j].poz] = contor;
                ++j;
            }

            contor++;
            i = j;
        }
    }

    --k;

   // for(i=0; i<=n-1; ++i)
     //   fprintf(fout, "%d ", prec[k][i]);

    for(i=0; i<=n-1; ++i)
        inv[prec[k][i]] = i;

    for(i=0; i <= n-K; ++i)
        ans = max(ans, prefix(inv[i],inv[i+K-1]));

    fprintf(fout, "%d", ans);

    fclose(fin);
    fclose(fout);
    return 0;
}