Pagini recente » Cod sursa (job #141589) | Cod sursa (job #1617546) | Cod sursa (job #200771) | Cod sursa (job #1702153) | Cod sursa (job #3258844)
#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;
}