Cod sursa(job #2608966)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 1 mai 2020 22:48:00
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("substr.in");
ofstream fout("substr.out");

const int NMAX = 20005;

struct idk{
    int fh,sh,poz;
};
idk v[NMAX];
char a[NMAX];
int dp[20][NMAX];
pair<int,int> aux[NMAX];
int n,step,put,k;

bool cmp(idk a,idk b){
    if(a.fh==b.fh) return a.sh<b.sh;
                   return a.fh<b.fh;
}

int lcp(int x,int y){
    if(x==y) return n-x+1;
    int rasp=0;
    for(int i=step-1;i>=0;i--){
        if(x>n or y>n) break;
        if(dp[i][x]==dp[i][y]){
            x+=(1<<i);
            y+=(1<<i);
            rasp+=(1<<i);
        }
    }
    return rasp;
}


int main()
{
    fin >> n >> k;
    fin >> (a+1);
    for(int i=1;i<=n;i++){
        dp[0][i]=a[i]-'a';
    }
    step=0,put=1;
    while(put/2<n){
        step++;
        for(int i=1;i<=n;i++){
            v[i].fh=dp[step-1][i];
            if(i+put>n) v[i].sh=-1;
            else v[i].sh=dp[step-1][i+put];
            v[i].poz=i;
        }
        sort(v+1,v+n+1,cmp);
        dp[step][v[1].poz]=1;
        int ind=1;
        for(int i=2;i<=n;i++){
            if(v[i].fh==v[i-1].fh and v[i].sh==v[i-1].sh)
                dp[step][v[i].poz]=dp[step][v[i-1].poz];
            else {
                dp[step][v[i].poz]=++ind;
            }
        }
        put*=2;
    }
    //for(int i=1;i<=n;i++) fout << dp[step][i] << '\n';
    for(int i=1;i<=n;i++){
        aux[i].first=dp[step][i];
        aux[i].second=i;
    }
    sort(aux+1,aux+n+1);
   // for(int i=1;i<=n;i++) fout << aux[i].second << ' ';
   // fout << '\n';
    int rr=0,aksjd;
    for(int i=1;i<=n-k+1;i++){
        aksjd=lcp(aux[i].second,aux[i+k-1].second);
        if(aksjd>rr) rr=aksjd;
    }
    fout << rr;
    return 0;
}