Pagini recente » Cod sursa (job #3267361) | Cod sursa (job #3295610) | Cod sursa (job #2989905) | Cod sursa (job #2708671) | Cod sursa (job #3300293)
#include <fstream>
#include <algorithm>
#include <deque>
#define dim 100000
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
int n,k,e,lg,ord[16][dim+1],p[dim+1],nr[dim+1],v[dim+1];
char s[dim+2];
deque <int> d;
bool cmp (int a,int b)
{
if (ord[e][a]==ord[e][b])
{
a+=lg,b+=lg;
if (a>=n||b>=n)
return a>b;
return ord[e][a]<ord[e][b];
}
return ord[e][a]<ord[e][b];
}
void suff ()
{
for (int i=0; i<n; i++)
{
ord[0][i]=s[i]-'a';
p[i]=i;
}
for (e=0; (1<<e)<=n; e++)
{
lg=(1<<e);
sort (p,p+n,cmp);
for (int i=0; i<n; i++)
nr[i]=nr[i-1]+cmp (p[i-1],p[i]);
for (int i=0; i<n; i++)
ord[e+1][p[i]]=nr[i];
}
}
void calc_pref ()
{
for (int i=0; i<n-1; i++)
{
int a=p[i],b=p[i+1],sol=0;
for (int bit=14; bit>=0; bit--)
{
if (a+(1<<bit)-1<n&&b+(1<<bit)-1<n&&ord[bit][a]==ord[bit][b])
sol+=(1<<bit),a+=(1<<bit),b+=(1<<bit);
}
v[i]=sol;
}
}
void solve ()
{
int sol=0;
for (int i=0; i<n-1; i++)
{
while (!d.empty ()&&v[d.back ()]>=v[i])
d.pop_back ();
d.push_back (i);
if (i>=k-1)
{
sol=max (sol,v[d.front ()]);
if (i-d.front ()+1==k)
d.pop_front ();
}
}
fout<<sol;
}
int main ()
{
fin>>n>>k>>s;
if (k==0)
{
fout<<n;
return 0;
}
k--;
suff ();
calc_pref ();
solve ();
return 0;
}