Pagini recente » Cod sursa (job #1621285) | Cod sursa (job #2030252) | Cod sursa (job #1946142) | Cod sursa (job #2836021) | Cod sursa (job #2846665)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
int n,k,i,j,s[20][100005],sa[100005],ma;
pair<pair<int,int>,int> cnt[100005];
char c;
void norm(int nod)
{
for (int i=1;i<=n;++i)
cnt[i].second=i;
sort(cnt+1,cnt+n+1);
int cn=0;
for (int i=1;i<=n;++i)
{
if (cnt[i].first!=cnt[i-1].first) cn++;
s[nod][cnt[i].second]=cn;
}
}
int lcp(int a,int b)
{
int rez=0;
for (int i=16;i>=0;--i)
{
if (s[i][a]==s[i][b]) {rez+=(1<<i); a+=(1<<i); b+=(1<<i);}
}
return rez;
}
int main()
{
in>>n>>k;
for (i=1;i<=n;++i)
{in>>c; s[0][i]=(int)(c);}
for (i=1;i<=16;++i)
{
for (j=1;j<=n;++j)
cnt[j].first={s[i-1][j],s[i-1][j+(1<<(i-1))]};
norm(i);
}
for (i=1;i<=n;++i)
sa[s[16][i]]=i;
if (k==1) {out<<n; return 0;}
for (i=1;i<=n-k+1;++i)
ma=max(ma,lcp(sa[i],sa[i+k-1]));
out<<ma;
return 0;
}