Pagini recente » Cod sursa (job #2342937) | Cod sursa (job #249761) | Cod sursa (job #1684222) | Cod sursa (job #2402675) | Cod sursa (job #1923189)
#include <fstream>
#include<algorithm>
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
char s[20010];
int n,k,m;
int sol[20][20010];
struct bla
{
int start,done,crt;
} l[20010];
void read ()
{
cin>>n>>k>>s;
int r=1;
while(r<n) r*=2,m++;
}
void up_date (int power,int poz)
{
l[poz].start=sol[power][poz];
l[poz].crt=poz;
int y=1<<power; y+=poz;
if(y<n) l[poz].done=sol[power][y]; else l[poz].done=-1;
}
bool sortare (bla q,bla w)
{
if(q.start==w.start) return q.done<w.done;
return q.start<w.start;
}
void init ()
{
for(int i=0;i<n;i++)
l[i].start=s[i],l[i].crt=i;
sort(l,l+n,sortare);
sol[0][l[0].crt]=0; int nr=0;
for(int j=1;j<n;j++)
{
if(l[j].start!=l[j-1].start || l[j].done!=l[j-1].done) nr++;
sol[0][l[j].crt]=nr;
}
}
void construct ()
{
for(int i=1;i<=m;i++)
{
for(int j=0;j<n;j++)
up_date(i-1,j);
sort(l,l+n,sortare);
sol[i][l[0].crt]=0; int nr=0;
for(int j=1;j<n;j++)
{
if(l[j].start!=l[j-1].start || l[j].done!=l[j-1].done) nr++;
sol[i][l[j].crt]=nr;
}
}
}
int lcp (int p1,int p2)
{
int rez=0,p3=p1,p4=p2;
if(p1==p2) return n-p1+1;
for(int i=m;i>=0;i--)
{
int y=1<<i;
if(sol[i][p1]==sol[i][p2])
p1+=y,p2+=y,rez+=y;
}
if(n-p3<rez) rez=n-p3;
if(n-p4<rez) rez=n-p4;
return rez;
}
void solve ()
{ int maxim=0;
for(int i=0;i<n;i++)
l[sol[m][i]].crt=i;
for(int i=0;i<n-k;i++)
maxim=max(maxim,lcp(l[i].crt,l[i+k-1].crt));
cout<<maxim;
}
int main()
{
read();
init();
construct();
solve();
cin.close();
cout.close();
return 0;
}