Pagini recente » Cod sursa (job #1940676) | Cod sursa (job #1860854) | Cod sursa (job #2661310) | Cod sursa (job #1727462) | Cod sursa (job #1804817)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 16500;
const int MOD1 = 100019;
const int MOD2 = 100043;
vector <pair<int,int> > v;
int s[NMAX];
int n, k;
int ok(int p)
{
v.clear();
int h1 = 0, h2 = 0, put1 = 1, put2 = 1;
for (int i = 0; i < p ; i++)
{
h1 = (h1 + (s[i]) * put1) % MOD1;
h2 = (h2 + (s[i]) * put2) % MOD2;
put1 = (put1 * 63) % MOD1;
put2 = (put2 * 63) % MOD2;
}
put1 /= 63;
put2 /= 63;
v.push_back({h1, h2});
for (int i = p; i < n; i++)
{
h1 = (h1 - (s[i - p] )) / 63 + (s[i] ) * put1 ;
h2 = (h2 - (s[i - p])) / 63 + (s[i] ) * put2;
h1 = h1 % MOD1;
h2 = h2 % MOD2;
if (h1 < 0)
h1 += MOD1;
if (h2 < 0)
h2 += MOD2;
v.push_back({h1, h2});
}
cout << "p = " << p << "\n";
for (int i = 0; i < v.size(); i++)
cout << v[i].first << " " ;
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;
for (int i = 0 ; i < n; i++)
{
char c;
cin >> c;
s[i] = c;
if (c >= '0' && c <= '9')
s[i] = s[i] - '0' + 1;
else if (c >= 'a' && c <= 'z')
s[i] =s[i] - 'a' + 11;
else if (c >= 'A' && c <= 'Z')
s[i] = s[i] - 'A' + 37;
}
int l1 = 1, sol = 0;
int l2 = n;
while (l1 <= l2)
{
int mid = (l1 + l2) / 2;
if (ok(mid))
{
sol = mid;
l1 = mid + 1;
}
else l2 = mid - 1;
}
cout << sol ;
return 0;
}