Pagini recente » Cod sursa (job #273089) | Cod sursa (job #908845) | Cod sursa (job #308053) | Cod sursa (job #682344) | Cod sursa (job #2347736)
#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");
pair< pair<int, int>, int >L[17000];
int p[17][17000], v[17000], n, k, i, e, len;
char s[17000];
int lcp(int i, int j) {
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';
}
e=0;
for(len=1; len<=n; len*=2) {
e++;
for (i=0;i<n;i++){
L[i].v1 = p[e][i];
if(i+len<n)
L[i].v2=p[e][i+len];
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].v1 == L[i-1].v1 && L[i].v2 == L[i-1].v2)
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;
}
int sol = 0;
for (i=0; i+k-1<n; i++) {
sol = max(sol, lcp( v[i], v[i+k-1] ));
}
fout<<sol;
}