Pagini recente » Cod sursa (job #2680394) | Cod sursa (job #714282) | Cod sursa (job #3218651) | Cod sursa (job #1954921) | Cod sursa (job #2559144)
#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" );
struct entry{
int val1, val2;
};
vector < entry > h;
char S[N];
int n, k;
bool cmp ( entry &a, entry &b ){
if ( a.val1 == b.val1 )
return a.val2 > b.val2;
return a.val1 > b.val1;
}
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].val1 == h[i - 1].val1 && h[i].val2 == h[i].val2 ){
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;
}