Cod sursa(job #1581524)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 26 ianuarie 2016 21:28:35
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<fstream>
#include<string>
#include<cstring>

using namespace std;

ifstream fin( "substr.in" ); ofstream fout( "substr.out" );

const int mod = 666013;
const int base = 62;
int n, k;
int f[ mod ];

string s;

inline int val( char x ) {
    if ( x >= '0' && x <= '9' ) {
        return x - '0';
    }
    if ( x >= 'a' && x <= 'z' ) {
        return 10 + x - 'a';
    }
    return 10 + 26 + x - 'A';
}
bool check( int lg ) {
    memset( f, 0, sizeof( f ) );
    int p = 1, key = 0;
    for( int i = 0; i < lg - 1; ++ i, p = (p * base) % mod ) {
        key = ( key * base + val( s[ i ] ) ) % mod;
    }
    for( int i = lg - 1; i < n; ++ i ) {
        key = ( key * base + val( s[ i ] ) ) % mod;

        ++ f[ key ];
        if ( f[ key ] >= k ) {
            return 1;
        }
        key = ( ( key - val( s[ i - lg + 1 ] ) * p ) % mod + mod ) % mod;
    }
    return 0;
}
int main() {
    fin >> n >> k >> s;

    int n2, ans;
    for( n2 = 1; (n2 << 1) <= n; n2 <<= 1 ) {
    }
    ans = 0;
    for( int step = n2; step > 0; step >>= 1 ) {
        if ( ans + step <= n && check( ans + step ) ) {
            ans += step;
        }
    }
    fout << ans << "\n";
    fin.close();
    fout.close();
    return 0;
}