Pagini recente » Cod sursa (job #118703) | Cod sursa (job #343194) | Cod sursa (job #2943111) | Cod sursa (job #580284) | Cod sursa (job #1804820)
#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 * 63 + s[i]) % MOD1;
h2 = (h2 * 63 + s[i]) % MOD2;
if (i != p - 1){
put1 = (put1 * 63) % MOD1;
put2 = (put2 * 63) % MOD2;
}
}
v.push_back({h1, h2});
for (int i = p; i < n; i++)
{
h1 = ((h1 - (s[i - p] * put1) % MOD1 + MOD1) * 63 + s[i]) % MOD1;
h2 = ((h2 - (s[i - p] * put2) % MOD2 + MOD2) * 63 + s[i]) % 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;
}