Pagini recente » Cod sursa (job #1143282) | Cod sursa (job #2955358) | Cod sursa (job #57569) | Cod sursa (job #573741) | Cod sursa (job #1785391)
#include <cstdio>
#include <algorithm>
#define MOD1 1000117
#define MOD2 100109
#define NMAX 17002
using namespace std;
int n, k;
char s[NMAX];
struct elem{
int a, b;
}R[NMAX];
inline bool cmp(elem x, elem y){
if(x.a != y.a) return x.a > y.a;
return x.b > y.b;
}
inline int Solve(int Length){
int P1 = 1, P2 = 1;
R[0].a = 0; R[0].b = 0;
for(int i = 0; i < Length ; ++i){
R[0].a = (R[0].a * 26 + (s[i] - 'a') ) % MOD1;
R[0].b = (R[0].b * 26 + (s[i] - 'a') ) % MOD2;
P1 = (P1 * 26) % MOD1;
P2 = (P2 * 26) % MOD2;
}int L = 0;
for(int i = 1 ; i + Length <= n ; ++i){
R[i].a = (R[i - 1].a * 26 - ( P1 * (s[i - 1] - 'a') ) % MOD1 + (s[i + Length - 1] - 'a') + MOD1) % MOD1;
R[i].b = (R[i - 1].b * 26 - ( P2 * (s[i - 1] - 'a') ) % MOD2 + (s[i + Length - 1] - 'a') + MOD2) % MOD2;
L = i;
}
sort(R, R + L + 1, cmp);
int P = 1, Max = -1;
for(int i = 1 ; i <= L ; ++i){
if(R[i].a == R[i - 1].a && R[i].b == R[i - 1].b) ++P;
else{
if(Max < P) Max = P;
P = 1;
}
}
if(Max < P) Max = P;
return Max;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d%d", &n, &k);
scanf("%s", s);
int st = 0, dr = n;
while(st + 1 < dr){
int mid = (st + dr) / 2;
if(Solve(mid) < k)
dr = mid;
else
st = mid;
}
if(Solve(dr) >= k) st = dr;
printf("%d", st);
return 0;
}