Pagini recente » Cod sursa (job #739995) | Cod sursa (job #364226) | Cod sursa (job #3255760) | Cod sursa (job #2761049) | Cod sursa (job #2795712)
#pragma GCC optimize("O3")
#include <unordered_map>
#include <fstream>
#include <stdio.h>
///#include <string>
#define MOD 1000000009
#define BASE 67
inline int val( char c ) {
if( 'a' <= c && c <= 'z' )
return ( c - 'a' );
else if( 'A' <= c && c <= 'Z' )
return ( c - 'A' + 27 );
return ( c - '0' + 54 );
}
#define MAX 17000
int n, k, res, curr, st, dr;
std::unordered_map<int, int> m;
int hash[ MAX ];
long long cop;
int v[ MAX ];
std::string s;
inline bool ok( int l ) {
m.clear(); // nu pot sa il pun la sfarsit :///
for( int i = 0; i <= n - l; ++i ) {
cop = ( long long )( hash[ i + l ] + MOD - hash[ i ] ) * v[ n - i - 1 ];
curr = cop % MOD;
++m[ curr ];
}
for( const auto& x : m )
if( x.second >= k )
return true;
return false;
}
int main()
{
std::ifstream fin( "substr.in" );
fin >> n >> k >> s;
fin.close();
v[ 0 ] = 1;
for( int i = 1; i <= n; ++i ) {
cop = ( long long )v[ i - 1 ] * BASE;
v[ i ] = cop % MOD;
}
for( int i = 0; i < n; ++i ) {
cop = hash[ i ] + ( long long )val( s[ i ] ) * v[ i ];
hash[ i + 1 ] = cop % MOD;
}
st = 0, dr = n;
while( st <= dr ) {
int med = ( st + dr ) / 2;
if( ok( med ) ) {
res = med;
st = med + 1;
} else dr = med - 1;
}
std::ofstream fout( "substr.out" );
fout << res << '\n';
fout.close();
return 0;
}