Pagini recente » Cod sursa (job #48694) | Cod sursa (job #2988125) | Cod sursa (job #807289) | Cod sursa (job #1000549) | Cod sursa (job #2347601)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
pair < pair < int, int >, int > L[16400];
int p[20][16400], v[16400], sol, n, k, expn, lenght;
char s[16400];
int lcp(int i, int j){
int f = expn;
int power = (1 << expn);
int sol = 0;
while(power){
if(p[f][i] == p[f][j]){
sol += power;
i += power;
j += power;
}
f--;
power /= 2;
}
return sol;
}
int main(){
fin>>n>>k;
if(k == 1){
fout<<n;
}
else{
fin>>s;
for(int i = 0; s[i] != 0; i++){
p[0][i] = s[i] - '0';
}
for(expn = 0, lenght = 1; lenght <= n; expn++, lenght *= 2){
for(int i = 0; i < n; i++){
L[i].first.first = p[expn][i];
if(i + lenght < n){
L[i].first.second = p[expn][i + lenght];
}
else{
L[i].first.second = -1;
}
L[i].second = i;
}
sort(L, L + n);
p[expn + 1][L[0].second] = 0;
for(int i = 1; i < n; i++){
if(L[i].first.first == L[i - 1].first.first && L[i].first.second == L[i - 1].first.second){
p[expn + 1][L[i].second] = p[expn + 1][L[i - 1].second];
}
else{
p[expn + 1][L[i].second] = p[expn + 1][L[i - 1].second] + 1;
}
}
}
for(int i = 0; i < n; i++){
v[p[expn][i]] = i;
}
sol = 0;
for(int i = 0; i + k - 1 < n; i++){
sol = max(sol, lcp(v[i], v[i + k - 1]));
}
fout<<sol;
}
return 0;
}