Cod sursa(job #1785391)

Utilizator giotoPopescu Ioan gioto Data 21 octombrie 2016 10:35:18
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}