Cod sursa(job #1074050)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 7 ianuarie 2014 03:56:39
Problema Substr Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <string>
#include <cstring>


using namespace std;

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

inline int vabs( int x ){

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


bool verif( int lung ){

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

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

        val = ( val * base + (int) str[i] ) % mod;
        val = val - (int) str[i - lung] * p;
        if( val < 0 ) val = val + ( vabs( val ) / mod + 1 ) * mod;
        ++viz[val];
        if( viz[val] >= 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;
}