Pagini recente » Cod sursa (job #369365) | Cod sursa (job #877125) | Borderou de evaluare (job #120147) | Cod sursa (job #2963443) | Cod sursa (job #2559156)
#include <fstream>
#include <vector>
#include <algorithm>
#define N 16385
#define u unsigned int
#define b1 27
#define b2 28
#define mod1 1000007
#define mod2 666013
using namespace std;
ifstream f ( "substr.in" );
ofstream g ( "substr.out" );
vector < pair < u , u > > h;
char S[N];
int n, k;
u p1[N], p2[N];
bool cmp ( pair < u, u > &a, pair < u, u > &b ){
if ( a.first == b.first )
return a.second > b.second;
return a.first > b.first;
}
bool verif ( int x ){
u x1 = 0, x2 = 0;
for ( int i = 1; i <= n; i++ ){
if ( i > x ){
x1 -= ( S[i - x] - 'a' ) * p1[x - 1];
x2 -= ( S[i - x] - 'a' + 1 ) * p2[x - 1];
}
x1 = x1 * b1 + ( S[i] - 'a' );
x2 = x2 * b2 + ( S[i] - 'a' + 1 );
if ( i >= x )
h.push_back ( { x1 % mod1, x2 % mod2 } );
}
sort ( h.begin ( ), h.end ( ), cmp );
int nr = 1;
bool ok = 0;
for ( int i = 1; i < h.size ( ); i++ ){
if ( h[i] == h[i - 1] ){
nr++;
if ( nr >= k ){
ok = 1;
break;
}
}
else
nr = 1;
}
h.clear ( );
return ok;
}
int main()
{ int st, dr, sol, i;
f >> n >> k;
f >> ( S + 1 );
p1[0] = p2[0] = 1;
for ( i = 1; i < n; i++ ){
p1[i] = p1[i - 1] * b1;
p2[i] = p2[i - 1] * b2;
}
st = 1, dr = n;
while ( st <= dr ){
int mid = ( st + dr ) / 2;
if ( verif ( mid ) == 1 ){
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
g << sol;
return 0;
}