Pagini recente » Cod sursa (job #2270573) | Cod sursa (job #606884) | Cod sursa (job #2122607) | Cod sursa (job #882104) | Cod sursa (job #2559145)
#include <fstream>
#include <vector>
#include <algorithm>
#define N 16385
#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 < int, int > > h;
char S[N];
int n, k;
bool cmp ( pair < int, int > &a, pair < int, int > &b ){
if ( a.first == b.first )
return a.second > b.second;
return a.first > b.first;
}
bool verif ( int x ){
int x1 = 0, x2 = 0, p1 = 1, p2 = 1;
for ( int i = 1; i < x; i++ ){
p1 *= b1;
p2 *= b2;
}
for ( int i = 1; i <= n; i++ ){
if ( i > x ){
x1 -= ( S[i - x] - 'a' ) * p1;
x2 -= ( S[i - x] - 'a' + 1 ) * p2;
}
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 <= n && ok == 0; i++ ){
if ( h[i] == h[i - 1] ){
nr++;
if ( nr >= k )
ok = 1;
}
else
nr = 1;
}
h.clear ( );
return ok;
}
int main()
{ int st, dr, sol;
f >> n >> k;
f >> ( S + 1 );
st = 1, dr = n / 3;
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;
}