Cod sursa(job #1074057)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 7 ianuarie 2014 04:04:02
Problema Substr Scor 70
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.64 kb
#include <fstream>
#include <string>
#include <cstring>


using namespace std;

string str;
const int base = 123, MAX_N = 16400, mod = 666013, mod2 = 1000003;
int N, K, ans, viz[mod], viz2[mod2];

inline long long vabs( long long x ){

    if( x < 0 ) return -x;
    return x;
}


bool verif( int lung ){

    long long val = 0, val2 = 0, p = 1, p2 = 1;
    for( int i = 0; i < lung; ++i ){

        p = ( p * base ) % mod;
        p2 = ( p2 * base ) % mod2;
        val = ( val * base + (int) str[i] ) % mod;
        val2 = ( val2 * base + (int) str[i] ) % mod2;
        }
    viz[val] = 1;
    viz2[val2] = 1;
    for( int i = lung; i < N; ++i ){

        val = ( val * base + (int) str[i] ) % mod;
        val2 = ( val2 * base + (int) str[i] ) % mod2;
        val = val - 1LL * (int) str[i - lung] * p;
        if( val < 0 ) val = val + ( vabs( val ) / mod + 1 ) * mod;
        ++viz[val];
        val2 = val2 - 1LL * (int) str[i - lung] * p2;
        if( val2 < 0 ) val2 = val2 + ( vabs( val2 ) / mod2 + 1 ) * mod2;
        ++viz2[val2];
        if( viz[val] >= K && viz2[val2] >= K ) return 1;

        }
    return 0;
}

void b_search(){

    int l = 1, r = N;
    while( l <= r ){

        int mid = ( l + r ) / 2;
        memset( viz, 0, sizeof( viz ) );
        if( verif( mid ) ){

            ans = max( ans, mid );
            l = mid + 1;
        }
        else r = mid - 1;
    }
}

int main()
{
    ifstream cin( "substr.in" );

    cin >> N >> K;
    cin >> str;

    cin.close();

    b_search();

    ofstream cout( "substr.out" );

    cout << ans;
    cout.close();

    return 0;
}