Pagini recente » Cod sursa (job #741353) | Cod sursa (job #2594865) | Cod sursa (job #30144) | Cod sursa (job #946075) | Cod sursa (job #3130530)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <unordered_map>
#define NMAX 16384
#define MOD 666013
#define BASE 256
using namespace std;
char word[NMAX];
bool verif( int l, int k, int n ) {
long long put = 1, i, hashval = 0;
for( i = 0; i < l; i++ ) {
hashval = ( hashval * BASE + word[i] ) % MOD;
if( i > 0 )
put = ( 1LL * put * BASE ) % MOD;
}
int maxx = 0;
unordered_map <long long, int> frecv;
for( ; i <= n; i++ ) {
frecv[hashval]++;
maxx = max( maxx, frecv[hashval] );
hashval -= word[i-l] * put % MOD;
if( hashval < 0 ) hashval += MOD;
hashval = ( hashval * BASE + word[i] ) % MOD;
}
return maxx >= k;
}
int main() {
FILE *fin, *fout;
int n, k, i, st, dr, mijl;
fin = fopen( "substr.in", "r" );
fout = fopen( "substr.out", "w" );
fscanf( fin, "%d%d ", &n, &k );
for( i = 0; i < n; i++ )
word[i] = fgetc( fin );
st = 0;
dr = n + 1;
while( dr - st > 1 ) {
mijl = ( st + dr ) / 2;
if( verif( mijl, k, n ) )
st = mijl;
else
dr = mijl;
}
fprintf( fout, "%d\n", st );
fclose( fin );
fclose( fout );
return 0;
}