Pagini recente » Cod sursa (job #1102674) | Cod sursa (job #548632) | Cod sursa (job #1773096) | Cod sursa (job #3137366) | Cod sursa (job #1074047)
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
string str;
const int base = 123, MAX_N = 16400, mod = 666013;
int N, K, ans, viz[mod];
inline int vabs( int x ){
if( x < 0 ) return -x;
return x;
}
bool verif( int lung ){
long long val = 0;
int p = 1;
for( int i = 0; i < lung; ++i ){
p = ( p * base ) % mod;
val = ( val * base + (int) str[i] ) % mod;
}
viz[val] = 1;
for( int i = lung; i < N; ++i ){
val = ( val * base + (int) str[i] ) % mod;
val = val - (int) str[i - lung] * p;
if( val < 0 ) val = val + ( vabs( val ) / mod + 1 ) * mod;
++viz[val];
if( viz[val] >= K ) return 1;
}
return 0;
}
void b_search(){
int l = 1, r = N;
while( l <= r ){
int mid = ( l + r ) / 2;
memset( viz, 0, sizeof( viz ) );
if( verif( mid ) ){
ans = max( ans, mid );
l = mid + 1;
}
else r = mid - 1;
}
}
int main()
{
ifstream cin( "substr.in" );
cin >> N >> K;
cin >> str;
cin.close();
b_search();
ofstream cout( "substr.out" );
cout << ans;
cout.close();
return 0;
}