Pagini recente » Cod sursa (job #3313564) | Cod sursa (job #3349945) | Cod sursa (job #117535) | Cod sursa (job #3335104) | Cod sursa (job #1804804)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 16500;
const int MOD1 = 100007;
const int MOD2 = 100021;
vector <pair<int,int> > v;
string s;
int n, k;
int ok(int p)
{
int h1 = 0, h2 = 0, put1 = 1, put2 = 1;
for (int i = 0; i < p ; i++)
{
h1 = (h1 + (s[i] - 'a') * put1) % MOD1;
h2 = (h2 + (s[i] - 'a') * put2) % MOD2;
put1 = (put1 * 26) % MOD1;
put2 = (put2 * 26) % MOD2;
}
v.push_back({h1, h2});
for (int i = p; i < s.size(); i++)
{
h1 = (h1 - (s[i - p] - 'a')) / 26 + (s[i] - 'a') * put1;
h2 = (h2 - (s[i - p] - 'a')) / 26 + (s[i] - 'a') * put2;
h1 = h1 % MOD1;
h2 = h2 % MOD2;
if (h1 < 0)
h1 += MOD1;
if (h2 < 0)
h2 += MOD2;
v.push_back({h1, h2});
}
sort(v.begin(), v.end());
int ap = 1;
for (int i = 1; i < v.size(); i++)
if(v[i].first == v[i - 1].first && v[i].second == v[i-1].second)
{
ap++;
if (ap >= k)
return 1;
}
else
ap = 1;
if (k == 1)
return 1;
return 0;
}
int main ()
{
ifstream cin ("substr.in");
ofstream cout ("substr.out");
cin >> n >> k;
cin >> s;
int l1 = 1, sol = 0;
int l2 = s.size();
while (l1 <= l2)
{
int mid = (l1 + l2) / 2;
if (ok(mid))
{
sol = mid;
l1 = mid + 1;
}
else l2 = mid - 1;
}
cout << sol ;
return 0;
}