Pagini recente » Cod sursa (job #616321) | Monitorul de evaluare | Cod sursa (job #233989) | Cod sursa (job #929070) | Cod sursa (job #2347737)
#include <fstream>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k,i,j,v[16400],p[15][16400],e,lung,sol;
char s[16400];
pair< pair<int,int>, int> L[16400];
int lcp(int i, int j) {
if (i==j){
return n-i;
}
int f=e;
int putere=(1<<e);
int sol=0;
while (putere){
if (p[f][i]==p[f][j]) {
sol+=putere;
i+=putere, j+=putere;
}
f--;
putere/=2;
}
return sol;
}
int main() {
fin>>n>>k;
fin>>s;
for (i=0;i<n;i++){
p[0][i]=s[i]-'0';
}
for (e=0, lung=1; lung<=n; e++, lung*=2) {
for (i=0; i<n; i++) {
L[i].v1=p[e][i];
if(i+lung<n)
L[i].v2=p[e][i+lung];
else{
L[i].v2=-1;
}
L[i].poz=i;
}
sort(L,L+n);
p[e+1][L[0].poz]=0;
for (i=1;i<n;i++)
if (L[i].first==L[i-1].first)
p[e+1][L[i].poz]=p[e+1][L[i-1].poz];
else
p[e+1][L[i].poz]=p[e+1][L[i-1].poz]+1;
}
for (i=0;i<n;i++){
v[p[e][i]]=i;
}
for (i=0;i+k-1<n;i++){
sol=max(sol,lcp(v[i],v[i+k-1]));
}
fout<<sol;
return 0;
}