Cod sursa(job #1065158)

Utilizator cont_de_testeCont Teste cont_de_teste Data 22 decembrie 2013 21:26:51
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int mod = 10007;
vector< pair<int, int> > hs[mod];
inline int add(const int& val) {
	const int line = val % mod;
	for (int i = 0; i < hs[line].size(); ++i) {
		if (hs[line][i].first == val) {
			return ++hs[line][i].second;
		}
	}
	hs[line].push_back(make_pair(val, 1));
	return 1;
}
inline void clear() {
	for (int i = 0; i < mod; ++i) {
		while (hs[i].size()) {
			hs[i].pop_back();
		}
	}
}

inline int make(const int& a, const int& b) {
	return a * 10000 + b;
}

const int MAX = 16400;
int n, k;
char a[MAX];

const int key1 = 257, key2 = 253;
const int mod1 = 9931, mod2 = 9227;
inline bool check(const int& len) {
	clear();
	int p1 = 1, p2 = 1, x1 = 0, x2 = 0;
	
	for (int i = 1; i <= n; ++i) {
		x1 = x1 * key1 + a[i];
		x1 = x1 % mod1;
		x2 = x2 * key2 + a[i];
		x2 = x2 % mod2;
		
		if (i >= len) {
			if (add(make(x1, x2)) == k) {
				return true;
			}
			x1 = x1 - p1 * a[i - len + 1];
			x1 %= mod1; x1 = x1 + mod1 * (x1 < 0);
			x2 = x2 - p2 * a[i - len + 1];
			x2 %= mod2; x2 = x2 + mod2 * (x2 < 0);
		} else {
			p1 *= key1; p1 %= mod1;
			p2 *= key2; p2 %= mod2;
		}
	}
	
	return false;
}

inline int binsrc() {
	int i = 0, cnt = 1 << 16;
	for (; cnt; cnt >>= 1) {
		if (i + cnt <= n && check(i + cnt)) {
			i += cnt;
		}
	}
	return i;
}

int main() {
	ifstream fin("substr.in");
	fin >> n >> k;
	fin >> a + 1;
	fin.close();
	
#ifdef INFOARENA
	ofstream fout("substr.out");
	fout << binsrc() << '\n';
	fout.close();
#else
	cout << binsrc() << '\n';
#endif
}