Pagini recente » Borderou de evaluare (job #1930160) | Cod sursa (job #2557030)
#include <map>
#include <fstream>
#include <iostream>
using namespace std;
ifstream in ( "substr.in" ) ;
ofstream out ( "substr.out" ) ;
const int MOD1 = 1e9 + 7 ;
const int MOD2 = 1e9 + 9 ;
const int BASE = 91 ;
map < pair < int , int > , int > strs ;
string s ;
int k ;
inline int ok ( int val )
{
long long i , h1 = 0 , h2 = 0 , p1 , p2 ;
strs.clear () ;
p1 = 1 ; p2 = 1 ;
for ( i = 0 ; i < val ; ++ i )
{
h1 = ( h1 * BASE + s [ i ] ) % MOD1 ;
h2 = ( h2 * BASE + s [ i ] ) % MOD2 ;
if ( i != val - 1 )
{
p1 = ( p1 * BASE ) % MOD1 ;
p2 = ( p2 * BASE ) % MOD2 ;
}
}
++ strs [ make_pair ( h1 , h2 ) ] ;
for ( i = val ; i < s.size () ; ++ i )
{
h1 = ( ( ( h1 - ( s [ i - val ] * p1 ) % MOD1 + MOD1 ) % MOD1 ) * BASE + s [ i ] ) % MOD1 ;
h2 = ( ( ( h2 - ( s [ i - val ] * p2 ) % MOD2 + MOD2 ) % MOD2 ) * BASE + s [ i ] ) % MOD2 ;
++ strs [ make_pair ( h1 , h2 ) ] ;
}
map < pair < int , int > , int > :: iterator it ;
/*out << val << '\n' ;
for ( it = strs.begin () ; it != strs.end () ; ++ it )
out << ( it -> first ).first << ' ' << ( it -> first ).second << ':' << ( it -> second ) << '\n' ;
out << '\n' ;*/
for ( it = strs.begin () ; it != strs.end () ; ++ it )
if ( ( it -> second ) >= k )
return 1 ;
return 0 ;
}
int main()
{
int n , st , dr , med , last = 0 , val ;
in >> n >> k >> s ;
st = 0 ; dr = n ;
while ( st <= dr )
{
med = ( st + dr ) >> 1 ;
val = ok ( med ) ;
if ( val )
st = med + 1 , last = med ;
else
dr = med - 1 ;
}
out << last ;
return 0;
}