Pagini recente » Cod sursa (job #2735380) | Cod sursa (job #2805559) | Cod sursa (job #2698677) | Cod sursa (job #2550660) | Cod sursa (job #2200394)
#include <bits/stdc++.h>
using namespace std;
#if 1
#define pv(x) cout<<#x<<" = "<<(x)<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif
#ifdef INFOARENA
ifstream in("substr.in");
ofstream out("substr.out");
#else
#define in cin
#define out cout
#endif
using ll = long long;
using ull = unsigned long long;
using ui = unsigned int;
#define pb push_back
#define mp make_pair
const int NMax = 2e4 + 5;
const ll inf_ll = 1e18 + 5;
const int inf_int = 1e9 + 5;
using zint = int;
int dp[20][NMax];
struct elem {
int o1,o2,idx;
bool operator<(const elem& other) {
return o1 == other.o1 ? o2 < other.o2 : o1 < other.o1;
}
};
int lcp(int x, int y, int step, int N) {
if (x == y) {return N - x;}
int ans = 0;
for (int k = step;k >= 0 && x < N && y < N; --k) {
if (dp[k][x] == dp[k][y]) {
ans += 1 << k;
x += 1 << k;
y += 1 << k;
}
}
return ans;
}
int main() {
cin.sync_with_stdio(false);
cin.tie(0);
int N,K;
string str;
in >> N >> K >> str;
for (int i = 0; i < N;++i) {
dp[0][i] = str[i] - 'a';
}
vector<elem> v(N);
int step = 1, pw = 1;
for (; pw <= N; ++step, pw <<= 1) {
for (int i = 0; i < N;++i) {
v[i].o1 = dp[step-1][i];
v[i].o2 = i + pw < N ? dp[step-1][i + pw] : -1;
v[i].idx = i;
}
sort(v.begin(), v.end());
dp[step][v[0].idx] = 0;
for (int i = 1; i < N; ++i) {
dp[step][v[i].idx] = dp[step][v[i-1].idx];
dp[step][v[i].idx] += !(v[i-1].o1 == v[i].o1 && v[i-1].o2 == v[i].o2);
}
}
--step;
int ans = 0;
for (int i = 0; i <= N - K; ++i) {
int val = lcp(v[i].idx, v[i + K - 1].idx, step, N);
ans = max(val, ans);
}
out << ans;
return 0;
}