Cod sursa(job #3260013)

Utilizator MogoneaMIhneaMogonea Mihnea Mihai MogoneaMIhnea Data 28 noiembrie 2024 20:29:30
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("substr.in");
ofstream fout("substr.out");
string s;
int sol,N,K,i,j,aux;
int f[1001],nr[1001],put2[17000],v[17000],m[20][17000];
struct S{
    int x;
    int y;
    int z;
}str[100001];
int LCP(int i,int j){
    int lenght=0;
    for(int k=put2[N];k>=0&&i<N&&j<N;k--){
        if(i+(1<<k)-1<N&&m[k][i]==m[k][j]){
            lenght+=(1<<k);
            i+=(1<<k);
            j+=(1<<k);
        }
    }
    return lenght;
}
int cmp(S a,S b){
    if(a.x==b.x){
        if(a.y==b.y)
            return a.z<b.z;
        return a.y<b.y;
    }
    return a.x<b.x;
}
int main (){
    fin>>N>>K;
    fin>>s;
    put2[1]=0;
    for(i=2;i<=N;i++)
        put2[i]=put2[i/2]+1;
    for(i=0;i<N;i++)
        f[s[i]]++;
    for(i=0;i<=1000;i++)
        if(f[i]!=0)
            aux++,nr[i]=aux;
    for(i=0;i<N;i++)
        m[0][i]=nr[s[i]];
    for(i=1;i<=put2[N]+1;i++){
        for(j=0;j<N;j++){
            if(j+(1<<(i-1))<N){
                str[j].x=m[i-1][j];
                str[j].y=m[i-1][j+(1<<(i-1))];
                str[j].z=j;
            }else{
                    str[j].x=m[i-1][j];
                    str[j].y=0;
                    str[j].z=j;
            }
        }
           sort(str,str+N,cmp);
        int lenght=0;
        for(j=0;j<N;j++){
            if(j==0||str[j].x!=str[j-1].x ||str[j].y!=str[j-1].y)
                lenght++;
        m[i][str[j].y]=lenght;
        }
    }
    for(i=0;i<N;i++)
        v[m[put2[N+1]][i]-1]=i;
    for(i=0;i+K-1<N;i++)
        sol=max(sol,LCP(v[i],v[i+K-1]));
    fout<<sol;
}
/*
y a b a d a b a d o o b a=>s
0 0 1 2 2 2 2 3 3 3 3 3 3=>put2
5 1 2 1 3 1 2 1 3 4 4 2 1=>m
*/