Pagini recente » Cod sursa (job #2508166) | Borderou de evaluare (job #2290147) | Cod sursa (job #1252194) | Cod sursa (job #3263935) | Cod sursa (job #3260013)
#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
*/