Pagini recente » Cod sursa (job #2735757) | Cod sursa (job #2228647) | Cod sursa (job #3197664) | Cod sursa (job #926423) | Cod sursa (job #3130522)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMAX 16384
#define MOD 4999999
#define BASE 256
using namespace std;
char word[NMAX];
int frecv[MOD+1];
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;
}
for( ; i <= n; i++ ) {
frecv[hashval]++;
hashval -= word[i-l] * put % MOD;
if( hashval < 0 ) hashval += MOD;
hashval = ( hashval * BASE + word[i] ) % MOD;
}
int maxx = 0;
for( i = 0; i < MOD; i++ ) {
maxx = max( frecv[i], maxx );
frecv[i] = 0;
}
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;
}