Cod sursa(job #1058970)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 16 decembrie 2013 00:13:08
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.19 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(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;
}