Pagini recente » Cod sursa (job #2036896) | Cod sursa (job #357834) | Cod sursa (job #1930218) | Cod sursa (job #2130385) | Cod sursa (job #1581524)
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
ifstream fin( "substr.in" ); ofstream fout( "substr.out" );
const int mod = 666013;
const int base = 62;
int n, k;
int f[ mod ];
string s;
inline int val( char x ) {
if ( x >= '0' && x <= '9' ) {
return x - '0';
}
if ( x >= 'a' && x <= 'z' ) {
return 10 + x - 'a';
}
return 10 + 26 + x - 'A';
}
bool check( int lg ) {
memset( f, 0, sizeof( f ) );
int p = 1, key = 0;
for( int i = 0; i < lg - 1; ++ i, p = (p * base) % mod ) {
key = ( key * base + val( s[ i ] ) ) % mod;
}
for( int i = lg - 1; i < n; ++ i ) {
key = ( key * base + val( s[ i ] ) ) % mod;
++ f[ key ];
if ( f[ key ] >= k ) {
return 1;
}
key = ( ( key - val( s[ i - lg + 1 ] ) * p ) % mod + mod ) % mod;
}
return 0;
}
int main() {
fin >> n >> k >> s;
int n2, ans;
for( n2 = 1; (n2 << 1) <= n; n2 <<= 1 ) {
}
ans = 0;
for( int step = n2; step > 0; step >>= 1 ) {
if ( ans + step <= n && check( ans + step ) ) {
ans += step;
}
}
fout << ans << "\n";
fin.close();
fout.close();
return 0;
}