Pagini recente » Cod sursa (job #2382270) | Cod sursa (job #1594198) | Cod sursa (job #1007078) | Cod sursa (job #3165055) | Cod sursa (job #2557052)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream in ( "substr.in" ) ;
ofstream out ( "substr.out" ) ;
const int NMAX = 1 << 16 ;
const int MOD1 = 1e9 + 7 ;
const int MOD2 = 1e9 + 9 ;
const int BASE = 91 ;
pair < int , int > v [ NMAX + 5 ] ;
string s ;
int k ;
inline int ok ( int val )
{
long long i , h1 = 0 , h2 = 0 , p1 , p2 , l = 0 ;
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 ;
}
}
v [ 0 ] = 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 ;
v [ i - val + 1 ] = make_pair ( h1 , h2 ) ;
}
sort ( v , v + s.size () - val + 1 ) ; l = 1 ;
for ( i = 1 ; i < s.size () - val + 1 ; ++ i )
if ( v [ i ] == v [ i - 1 ] )
++ l ;
else
{
if ( l >= k )
return 1 ;
l = 1 ;
}
if ( l >= val )
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;
}