Pagini recente » Cod sursa (job #1907947) | Cod sursa (job #2000498) | Cod sursa (job #1936880) | Cod sursa (job #2035258) | Cod sursa (job #1581548)
#include<fstream>
#include<string>
#include<cstring>
#include<map>
using namespace std;
ifstream fin( "substr.in" ); ofstream fout( "substr.out" );
map< pair< int, int >, int > f;
const int mod1 = 666013;
const int mod2 = 96235;
const int base = 62;
int n, k;
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 ) {
f.clear();
int p1 = 1, p2 = 1, key1 = 0, key2 = 0;
for( int i = 0; i < lg - 1; ++ i, p1 = (p1 * base) % mod1, p2 = (p2 * base) % mod2 ) {
key1 = ( key1 * base + val( s[ i ] ) ) % mod1;
key2 = ( key2 * base + val( s[ i ] ) ) % mod2;
}
for( int i = lg - 1; i < n; ++ i ) {
key1 = ( key1 * base + val( s[ i ] ) ) % mod1;
key2 = ( key2 * base + val( s[ i ] ) ) % mod2;
++ f[ make_pair( key1, key2 ) ];
if ( f[ make_pair( key1, key2 ) ] >= k ) {
return 1;
}
key1 = ( ( key1 - val( s[ i - lg + 1 ] ) * p1 ) % mod1 + mod1 ) % mod1;
key2 = ( ( key2 - val( s[ i - lg + 1 ] ) * p2 ) % mod2 + mod2 ) % mod2;
}
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;
}