Pagini recente » Cod sursa (job #380844) | Cod sursa (job #2055249) | Statistici Darau Vlad Dragos (vladoboy) | Cod sursa (job #3292076) | Cod sursa (job #3222440)
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream in ("substr.in");
ofstream out ("substr.out");
#define MAX_N 16384
#define MAX_C 27
#define MOD 1000000009
char v[MAX_N];
int n;
unordered_map<long long, int> myMap;
long long lgPut(long long a, long long b)
{
if(b == 0)
return 1;
if(b == 1)
return a;
if(b % 2 == 0)
{
return lgPut(a * a % MOD, b / 2);
} else
{
return a * lgPut(a * a % MOD, b / 2) % MOD;
}
}
long long verif(long long k)
{
myMap.clear();
long long curr = 0;
for(int i = 0; i < k; ++i) //building the first number
{
curr = curr * MAX_C + (v[i] - 'a');
curr %= MOD;
}
cout << curr << " ";
myMap[curr]++;
for(int i = k; i < n; ++i)
{
cout << "t";
curr -= (v[i - k] - 'a') * lgPut(MAX_C, k - 1) % MOD;
curr = curr * MAX_C + (v[i] - 'a');
curr %= MOD;
cout << curr << " ";
myMap[curr]++;
}
int ans = 0;
for(auto x : myMap)
{
//cout << x.first << " " << x.second << '\n';
ans = max(ans, x.second);
}
cout << '\n';
return ans;
}
int main()
{
int k;
in >> n >> k;
for(int i = 0; i < n; ++i)
{
in >> v[i];
}
if(k == 1)
{
out << n;
return 0;
}
//cautare binara
int st = 0, dr = MAX_N, mid;
while(dr - st > 1)
{
mid = (st + dr) / 2;
cout << st << " " << mid << " " << dr << '\n';
if(verif(mid) >= k)
{
st = mid;
} else
{
dr = mid;
}
}
out << st;
return 0;
}