Pagini recente » Cod sursa (job #580764) | Cod sursa (job #728617) | Cod sursa (job #380026) | Cod sursa (job #2983845) | Cod sursa (job #2681557)
#include<bits/stdc++.h>
using namespace std;
const int N = 16390;
const int M = 20;
string s;
int n,k;
int P[M][N],pas,logn,dim,pos[N];
struct duplu{
int first,second,index;
bool operator < (duplu other) const {
return first == other.first ? second < other.second : first< other.first;
}
}L[N];
void init()
{
dim = n;
for(int i=0;i<dim;++i)
P[0][i] = (int)s[i];
}
void sufix_arrays()
{
for(pas = 1, logn = 1; (pas>> 1) < dim; ++ logn, pas <<= 1)
{
for(int i=0;i<dim;++i)
{
L[i].first = P[logn - 1][i];
if(i + pas < dim)
L[i].second = P[logn-1][i+pas];
else
L[i].second = -1;
L[i].index= i;
}
sort(L,L+dim);
for(int i=0;i<dim;++i)
{
//normalizare
P[logn][L[i].index] = i;
//caz de egalitate
if(L[i].first == L[i-1].first && L[i].second == L[i-1].second)
P[logn][L[i].index] = P[logn][L[i-1].index];
}
//cerr<<P[logn][1]<<'\n';
}
}
int lcp(int x, int y) {
int sol = 0;
if(x == y)
return dim - x;
for(int k = logn - 1; k >= 0 && x < dim && y < dim; -- k) {
if(P[k][x] == P[k][y]) {
sol += (1 << k);
x += (1 << k);
y += (1 << k);
}
}
return sol;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
cin>>n>>k;
cin>>s;
init();
sufix_arrays();
//for(int i=0;i<dim;++i)
// pos[P[logn][i]] = i;
//cerr<<s[L[0].index]<<' '<<lcp(0,2);
int ans=-1;
for(int i=0;i<=n-k;++i)
ans=max(ans,lcp(L[i].index,L[i+k-1].index));
cout<<ans<<'\n';
}