Pagini recente » Cod sursa (job #2042303) | Cod sursa (job #2746978) | Cod sursa (job #933153) | Cod sursa (job #2077629) | Cod sursa (job #2608966)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int NMAX = 20005;
struct idk{
int fh,sh,poz;
};
idk v[NMAX];
char a[NMAX];
int dp[20][NMAX];
pair<int,int> aux[NMAX];
int n,step,put,k;
bool cmp(idk a,idk b){
if(a.fh==b.fh) return a.sh<b.sh;
return a.fh<b.fh;
}
int lcp(int x,int y){
if(x==y) return n-x+1;
int rasp=0;
for(int i=step-1;i>=0;i--){
if(x>n or y>n) break;
if(dp[i][x]==dp[i][y]){
x+=(1<<i);
y+=(1<<i);
rasp+=(1<<i);
}
}
return rasp;
}
int main()
{
fin >> n >> k;
fin >> (a+1);
for(int i=1;i<=n;i++){
dp[0][i]=a[i]-'a';
}
step=0,put=1;
while(put/2<n){
step++;
for(int i=1;i<=n;i++){
v[i].fh=dp[step-1][i];
if(i+put>n) v[i].sh=-1;
else v[i].sh=dp[step-1][i+put];
v[i].poz=i;
}
sort(v+1,v+n+1,cmp);
dp[step][v[1].poz]=1;
int ind=1;
for(int i=2;i<=n;i++){
if(v[i].fh==v[i-1].fh and v[i].sh==v[i-1].sh)
dp[step][v[i].poz]=dp[step][v[i-1].poz];
else {
dp[step][v[i].poz]=++ind;
}
}
put*=2;
}
//for(int i=1;i<=n;i++) fout << dp[step][i] << '\n';
for(int i=1;i<=n;i++){
aux[i].first=dp[step][i];
aux[i].second=i;
}
sort(aux+1,aux+n+1);
// for(int i=1;i<=n;i++) fout << aux[i].second << ' ';
// fout << '\n';
int rr=0,aksjd;
for(int i=1;i<=n-k+1;i++){
aksjd=lcp(aux[i].second,aux[i+k-1].second);
if(aksjd>rr) rr=aksjd;
}
fout << rr;
return 0;
}