Pagini recente » Cod sursa (job #62324) | Cod sursa (job #539835) | Cod sursa (job #705602) | Monitorul de evaluare | Cod sursa (job #1473164)
#include<bits/stdc++.h>
using namespace std;
typedef struct lol {
int x,y,poz;
}troll;
int i,j,n,k,sfa[17][16505],lg,rs,l,poz[16505];
troll b[16505];
string s;
bool cmp(const troll &a,const troll &b) {
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int Prefix(int x,int y) {
if(x==y) return n-x+1;
int aux=0,i;
for(i=lg;i>=0 && x<=n && y<=n;--i)
if(sfa[i][x]==sfa[i][y]) aux+=(1<<i),x+=(1<<i),y+=(1<<i);
return aux;
}
int main()
{
ifstream cin("substr.in");
ofstream cout("substr.out");
cin>>n>>k; getline(cin,s);
getline(cin,s);
for(int aux=n;aux;aux/=2) ++lg;
for(i=1;i<=n;++i) sfa[0][i]=s[i-1]-'a';
for(i=l=1;i<=lg && l<=n;++i,l<<=1)
{
for(j=1;j<=n;++j)
{
b[j].x=sfa[i-1][j];
b[j].y=(j+l<=n ? sfa[i-1][j+l]:-1);
b[j].poz=j;
}
sort(b+1,b+n+1,cmp);
for(j=1;j<=n;++j)
if(b[j].x==b[j-1].x && b[j].y==b[j-1].y) sfa[i][b[j].poz]=sfa[i][b[j-1].poz];
else sfa[i][b[j].poz]=j;
}
for(i=1;i<=n;++i) poz[sfa[lg][i]]=i;
for(i=1;i<=n-k;++i) rs=max(rs,Prefix(poz[i],poz[i+k-1]));
cout<<rs<<'\n';
return 0;
}