Pagini recente » Cod sursa (job #1522801) | Cod sursa (job #1265380) | Cod sursa (job #2611054) | Cod sursa (job #2865405) | Cod sursa (job #2697544)
#include <fstream>
#include <string>
#include <unordered_map>
using namespace std;
ifstream cin("substr.in");
ofstream cout("substr.out");
typedef long long ll;
const int nmax = 16400;
const int base = 191;
const ll mod = 1e9 + 7;
int n, k;
string s;
ll pw[nmax], h[nmax];
unordered_map <ll, int> mp;
void read(){
cin >> n >> k;
cin >> s;
}
int cif(char ch){
if(ch >= 'a' && ch <= 'z')
return (ch - 'a');
if(ch >= 'A' && ch <= 'Z')
return (ch - 'A' + 26);
return (ch - '0' + 52);
}
void init(){
pw[0] = 1;
for(int i = 1; i <= n; i++)
pw[i] = (1LL * pw[i - 1] * base) % mod;
for(int i = 1; i <= n; i++)
h[i] = (1LL * h[i - 1] * base + cif(s[i - 1])) % mod;
}
bool checks(int len){
mp.clear();
for(int i = 1; i <= n - len + 1; i++){
ll nr = (h[i + len - 1] - 1LL * h[i - 1] * pw[len]) % mod;
if(nr < 0)
nr += mod;
nr %= mod;
mp[nr]++;
}
for(auto it : mp)
if(it.second >= k)
return true;
return false;
}
void findAns(){
init();
int l = 0, r = n / k, mid, ans = 0;
while(l <= r){
mid = (l + r) / 2;
if(checks(mid)){
ans = mid;
l = mid + 1;
} else
r = mid - 1;
}
cout << ans;
}
int main()
{
read();
findAns();
return 0;
}