Pagini recente » Monitorul de evaluare | Cod sursa (job #1781599) | Cod sursa (job #3150057) | Cod sursa (job #2967299) | Cod sursa (job #1058972)
#include <iostream>
#include <fstream>
#include <unordered_map>
const static int NMAX = 16386;
const static int Base = 73;
using namespace std;
ifstream input("substr.in");
ofstream output("substr.out");
int N , K;
char inputString[NMAX];
int nrAparitii(const int & dimensiune)
{
unordered_map<unsigned int , int> hashTable;
unsigned int key = 0;
unsigned int power = 1;
int maxAparitii = 1;
for (int i = 0 ; i < dimensiune; i++)
{
key = key * Base + inputString[i];
if (i != 0)
power *= Base;
}
hashTable[key] = 1;
for (int i = dimensiune; i < N ; i++)
{
key = (key - power * inputString[i - dimensiune]) * Base + inputString[i];
if (hashTable.find(key) != hashTable.end())
{
hashTable[key] ++;
}
else
{
hashTable[key] = 1;
}
if (maxAparitii < hashTable[key])
{
maxAparitii = hashTable[key];
}
}
return maxAparitii;
}
int main()
{
input >> N >> K;
input >> inputString;
int left = 0;
int right = N;
int answer = 0;
while (left <= right)
{
int middle = (left + right) >> 1;
if (nrAparitii(middle) >= K)
{
if (answer < middle)
answer = middle;
left = middle + 1;
}
else
{
right = middle - 1;
}
}
output << answer;
return 0;
}