Mai intai trebuie sa te autentifici.
Cod sursa(job #1058968)
Utilizator | Data | 16 decembrie 2013 00:10:38 | |
---|---|---|---|
Problema | Substr | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Teme Pregatire ACM Unibuc 2013 | Marime | 1.16 kb |
#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(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 = 2; i < N ; i++)
{
key = (key - Base * inputString[i - dimensiune]) * Base + inputString[i];
if (hashTable[key] != 0)
{
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;
}