Pagini recente » Cod sursa (job #1638851) | Cod sursa (job #128130) | Cod sursa (job #972545) | Cod sursa (job #2068208) | Cod sursa (job #2456120)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod1 = 99929;
const int mod2 = 99923;
const int alpha = 26;
const int DIM = 17000;
int power1[DIM];
int power2[DIM];
int n, k;
string s;
bool check(int i)
{
int h1 = 0;
int h2 = 0;
vector <pair <int, int> > v;
for(int j = 1; j <= i; j++)
{
h1 = (h1 * alpha + (s[j] - 'a')) % mod1;
h2 = (h2 * alpha + (s[j] - 'a')) % mod2;
}
v.push_back({h1, h2});
for(int j = i + 1; j <= n; j++)
{
h1 = (h1 - (power1[i] * (s[j - i] - 'a')) % mod1 + mod1) % mod1;
h2 = (h2 - (power2[i] * (s[j - i] - 'a')) % mod2 + mod2) % mod2;
h1 = (h1 * alpha + (s[j] - 'a')) % mod1;
h2 = (h2 * alpha + (s[j] - 'a')) % mod2;
v.push_back({h1, h2});
}
sort(v.begin(), v.end());
int nr = 1;
for(int j = 1; j < v.size(); j++)
if(v[j] == v[j - 1])
{
nr++;
if(nr == k)
{
return true;
}
}
else
{
nr = 1;
}
return false;
}
main()
{
fin >> n >> k;
if(k == 1)
{
fout << n;
return 0;
}
power1[1] = 1;
power2[1] = 1;
for(int i = 2; i <= n; i++)
{
power1[i] = (power1[i - 1] * alpha) % mod1;
power2[i] = (power2[i - 1] * alpha) % mod2;
}
fin >> s;
s = ' ' + s;
int l = 1;
int r = n - k + 1;
int res = 0;
while(l <= r)
{
int mid = (l + r) / 2;
if(check(mid) == true)
{
l = mid + 1;
res = mid;
}
else
{
r = mid - 1;
}
}
fout << res;
}