Cod sursa(job #3258844)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 23 noiembrie 2024 20:50:48
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k,i,j,x,y,cnt,sol;
int p[16][16400];
char c[16400];
struct trip{
    int x,y,ind;
}v[16400];
int cmp(trip a, trip b){
    if(a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
int main()
{
    fin>>n>>k;
    if(k == 1){
        fout<<n;
        return 0;
    }
    fin>>c+1;
    for(i=1;i<=n;i++)   v[i]={c[i],-1,i};
    sort(v+1,v+n+1,cmp);
    cnt=0;
    for(i=1;i<=n;i++){
        if(v[i].x != v[i-1].x || v[i].y != v[i-1].y)
            cnt++;
        p[0][v[i].ind] = cnt;
    }
    for(j=1;j<16;j++){
        for(i=1;i<=n;i++){
            if(i+(1<<(j-1))<=n)
                v[i] = {p[j-1][i], p[j-1][i+(1<<(j-1))],i};
            else
                v[i] = {p[j-1][i], -1,i};
        }
        sort(v+1,v+n+1,cmp);
        cnt=0;
        for(i=1;i<=n;i++){
            if(v[i].x != v[i-1].x || v[i].y != v[i-1].y)
                cnt++;
            p[j][v[i].ind] = cnt;
        }
    }
    for(i=1;i<=n-k+1;i++){
        x=v[i].ind;
        y=v[i+k-1].ind;
        for(j=15; j>=0; j--){
            if(y+(1<<j)>n)
                continue;
            if(p[j][x] == p[j][y]){
                x += (1<<j);
                y += (1<<j);
            }
        }
        sol = max(sol, x-v[i].ind);
    }
    fout<<sol;
    return 0;
}