Cod sursa(job #1850003)

Utilizator andreiulianAndrei andreiulian Data 18 ianuarie 2017 01:01:10
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream> 
#include <fstream>
#include <cmath>
//#include <vector>
//#include <set>
#include <algorithm>
#include <unordered_map>
#include <cstring>
//#include <string>
//#include <queue>

#define mp make_pair
#define pb push_back
#define ff(i, x, n) for (int i = x; i <= n; ++i)
#define dd cout << 
#define nn << '\n'
#define ss << ' ' <<
#define prim 1299709
using namespace std;
char t[10000005], c[25];
vector<unsigned int> v[prim];
bool cauta(unsigned int nr) {
	int l = nr % prim;
	for (auto it = v[l].begin(); it!= v[l].end(); ++it) {
		if (*it == nr) {
			return 1;
		}
	}
	return 0;
}
int main(){
		//freopen("schi.in", "r", stdin);
		//freopen("schi.out", "w", stdout);
		ifstream in("abc2.in");
		ofstream out("abc2.out");
	in >> t;
	int lt = strlen(t), lc = 0, r = 0, i;
	unsigned int nr;
	ff(i, 0, lt - 1) {
		t[i] -= 'a';
	}
	while (in >> c) {
		nr = 0;
		lc = (lc != 0)? (lc) : (strlen(c));
		ff(i, 0, lc - 1) {
			nr = nr * 3 + c[i] - 'a';
		}
		v[nr % prim].pb(nr);
	}
	nr = 0;
	long long pp = pow(3, lc - 1);
	for (i = 0; i < lc; ++i) {
		nr = nr * 3 + t[i];
	}
	if (cauta(nr)) {
		++r;
	}
	for (; i < lt; ++i) {
		nr -= pp * t[i - lc];
		nr *= 3;
		nr += t[i];
		if (cauta(nr)) {
			++r;
		}
	}
	cout << r << '\n';
}