Pagini recente » Cod sursa (job #2094438) | Cod sursa (job #2162313) | Cod sursa (job #2672086) | Cod sursa (job #2944274) | Cod sursa (job #2845881)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int k,n,i,j,ap[256],nr[256],cnt,sa[17][17000],v[17000];
string s;
pair<pair<int,int>,int> cod[17000];
int lcp(int i, int j)
{
int ans=0;
for(int k=16;i<=n&&j<=n&&k>=0;k--)
if(sa[k][i]==sa[k][j])
{
ans+=(1<<k);
i+=(1<<k);
j+=(1<<k);
}
return ans;
}
int rez;
int main()
{
fin>>n>>k;
fin>>s;
s="%"+s;
for(i=1;i<=n;i++)
ap[s[i]]=1;
for(i=0;i<256;i++)
if(ap[i])
nr[i]=++cnt;
for(i=1;i<=n;i++)
sa[0][i]=nr[s[i]];
for(i=1;i<=16;i++)
{
cnt=0;
for(j=1;j<=n;j++)
{
if(j+(1<<(i-1))<=n)
cod[j]={{sa[i-1][j],sa[i-1][j+(1<<(i-1))]},j};
else cod[j]={{sa[i-1][j],0},j};
}
sort(cod+1,cod+n+1);
for(j=1;j<=n;j++)
{
if(cod[j].first!=cod[j-1].first)
cnt++;
sa[i][cod[j].second]=cnt;
}
}
for(i=1;i<=n;i++)
v[sa[16][i]]=i;
for(i=1;i<=n;i++)
{
if(i+k-1>n)
break;
int tt=lcp(v[i],v[i+k-1]);
rez=max(rez,tt);
}
fout<<rez<<'\n';
return 0;
}