Pagini recente » Cod sursa (job #1852030) | Cod sursa (job #1788581) | Cod sursa (job #1907681) | Cod sursa (job #1767374) | Cod sursa (job #1070558)
#include <cstdio>
#include <tr1/unordered_map>
#include <algorithm>
using namespace std;
using namespace std::tr1;
#define MAX_N 16500
#define BASE 123
char s[MAX_N];
unordered_map< int, int > h;
void read( FILE *fin, int &n, int &k ) {
fscanf( fin, "%d%d\n", &n, &k );
fgets( s, MAX_N, fin );
}
int check( int len, int n ) {
// bulaneala cu hashuri
int number = 0, power = 1;
for ( int i = 0; i < len; ++i )
number = number * BASE + (int) s[i];
for ( int i = 1; i < len; ++i )
power *= BASE;
h[number] = 1;
for ( int i = len; i < n; ++i ) {
number -= s[i - len] * power;
number = number * BASE + (int) s[i];
++h[number];
}
int ans = 0;
for ( unordered_map< int, int >::iterator it = h.begin(); it != h.end(); ++it )
ans = max( ans, it->second );
h.clear();
return ans;
}
int binary_search( int n, int k ) {
int i, pas = 1 << 14;
for ( i = 0; pas; pas >>= 1 )
if ( i + pas <= n && check( i + pas, n ) >= k )
i += pas;
return i;
}
int main() {
FILE *fin, *fout;
fin = fopen( "substr.in", "r" );
int n, k;
read( fin, n, k );
fclose( fin );
fout = fopen( "substr.out", "w" );
fprintf( fout, "%d\n", binary_search( n, k ) );
fclose( fout );
}