Pagini recente » Cod sursa (job #367325) | Cod sursa (job #1971313) | Cod sursa (job #1472762) | Cod sursa (job #188797) | Cod sursa (job #2433953)
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define sz(x) (int)((x).size())
#define all(x) (x).begin(),(x).end()
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define eb emplace_back
typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef vector< pll > vpll;
typedef long double ld;
typedef vector< ld > vld;
const ll MOD = 1e9 + 7;
void fix(ll &x, ll &MOD) {
x = (x % MOD + MOD) % MOD;
return;
}
ll lgput(ll a, ll b, ll MOD) {
ll ret = 1;
a %= MOD;
while(b) {
if(b&1) ret = ret*a % MOD;
a = a*a % MOD;
b >>= 1;
}
return ret;
}
struct str{
int a, b, c;
str(int _a = 0, int _b = 0, int _c = 0) : a(_a), b(_b), c(_c) {}
const bool operator < (str &o) const {
return a==o.a?b<o.b:a<o.a;
}
};
const int MAXN = 16400;
const int MAXLOG = 16;
int p[MAXLOG][MAXN];
int sortate[MAXN];
vector< str > v;
int n, k;
string s;
int lcp(int x, int y) {
int ret = 0;
for(int step = MAXLOG-1; step >= 0; --step) {
if(x+(1<<step) <= sz(s) && y+(1<<step) <= sz(s) && p[step][x] == p[step][y]) {
x += (1<<step);
y += (1<<step);
ret += (1<<step);
}
}
return ret;
}
int main() {
#ifdef BLAT
freopen("stdin", "r", stdin);
freopen("stderr", "w", stderr);
#else
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout.precision(12);
srand(time(NULL));
int n, k;
cin >> n >> k;
cin >> s;
v.resize(sz(s));
for(int i = 0; i < sz(s); ++i) {
p[0][i] = s[i];
}
for(int pas = 1, dim = 1; pas < MAXLOG; ++pas, dim <<= 1) {
for(int i = 0; i < sz(s); ++i) {
v[i].a = p[pas-1][i];
v[i].b = i+dim<sz(s)?p[pas-1][i+dim]:-1;
v[i].c = i;
}
sort(all(v));
for(int i = 0; i < sz(s); ++i) {
if(i && v[i].a == v[i-1].a && v[i].b == v[i-1].b) p[pas][v[i].c] = p[pas][v[i-1].c];
else p[pas][v[i].c] = i;
sortate[i] = v[i].c;
}
}
int ans = 0;
for(int i = 0; i + k - 1 < sz(s); ++i) {
ans = max(ans, lcp(sortate[i], sortate[i+k-1]));
}
cout << ans << '\n';
}