Pagini recente » Cod sursa (job #298814) | Cod sursa (job #1650531) | Cod sursa (job #2169703) | Cod sursa (job #1532932) | Cod sursa (job #1853668)
#include <fstream>
#include<algorithm>
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
int n,k,sol[15][20010],m,maxim=0;
char s[20010];
struct bla
{
int first,second,poz;
} t[20010];
void read ()
{
cin>>n>>k>>s;
n--;
}
int convert (char c)
{
if(c>='0' && c<='9') return c-'0';
if(c>='A' && c<='Z') return 10+c-'A';
if(c>='a' && c<='z') return 10+26+c-'a';
return 0;
}
void init ()
{
int r=1;
while(r<n) r*=2,m++;
for(int i=0;i<=n;i++)
t[convert(s[i])].poz=1;
int nr=-1;
for(int i=0;i<=100;i++)
if(t[i].poz==1) t[i].poz=++nr;
for(int i=0;i<=n;i++)
sol[0][i]=t[convert(s[i])].poz;
}
bool sortare (bla q,bla w)
{
if(q.first!=w.first) return q.first<w.first;
return q.second<w.second;
}
void construct_suffix_array ()
{
for(int i=1;i<=m;i++)
{ int y=i-1; y=1<<y;
for(int j=0;j<=n;j++)
{t[j].first=sol[i-1][j],t[j].second=sol[i-1][y+j],t[j].poz=j; if(+j>n) t[j].second=-1;}
sort(t,t+n+1,sortare);
int nr=0;
sol[i][t[0].poz]=0;
for(int j=1;j<=n;j++)
if(t[j].first==t[j-1].first && t[j].second==t[j-1].second) sol[i][t[j].poz]=nr;
else sol[i][t[j].poz]=++nr;
}
}
int lcp (int i,int j)
{
if(i==j) return n-i+1;
int rez=0;
for(int k=m;k>=0;k--)
if(sol[k][i]==sol[k][j] && i<=n && j<=n)
i=i+1<<k,j=j+1<<k,rez=rez+1<<k;
return rez;
}
void solve_here ()
{
for(int i=0;i<=n;i++)
t[sol[m][i]].poz=i;
for(int i=0;i<=n-k+1;++i)
{
int c=lcp(t[i].poz,t[i+k-1].poz);
if(c>maxim) maxim=c;
}
}
void write ()
{
cout<<maxim;
}
int main()
{
read();
init();
construct_suffix_array();
solve_here();
write();
cin.close();
cout.close();
return 0;
}