Pagini recente » Cod sursa (job #2679271) | Cod sursa (job #1299053) | Cod sursa (job #2023655) | Cod sursa (job #2026450) | Cod sursa (job #2692298)
#include <bits/stdc++.h>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
int lg2[20005],mat[25][20005],sufix[20005];
string s;
int n,k;
pair<pair<int,int>,int> key[20005];
int lcp(int a,int b)
{
int rez=0;
int point=n-max(a,b)+1;
for(int i=lg2[point];i>=0;i--)
{
if(mat[i][a]==mat[i][b])
{
rez+=(1<<i);
a+=(1<<i);
b+=(1<<i);
}
}
return rez;
}
void sufixx_arry()
{
for(int i=1;i<=n;i++)
mat[0][i]=s[i];
for(int i=1;i<=lg2[n]+1;i++)
{
for(int j=1;j<=n;j++)
key[j]={{mat[i-1][j],mat[i-1][j+(1<<(i-1))]},j};
sort(key+1,key+n+1);
int ct=0;
for(int j=1;j<=n;j++)
{
if(key[j].first!=key[j-1].first)
ct++;
mat[i][key[j].second]=ct;
}
}
}
int main()
{
in>>n>>k;
for(int i=1;i<=n;i++)
lg2[i]=lg2[i/2]+1;
in>>s;
s='#'+s;
if(k==1)
{
out<<n<<"\n";
return 0;
}
sufixx_arry();
for(int i=1;i<=n;i++)
sufix[mat[lg2[n]+1][i]]=i;
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,lcp(sufix[i],sufix[i+k-1]));
out<<ans;
return 0;
}