Cod sursa(job #1846410)

Utilizator greenadexIulia Harasim greenadex Data 12 ianuarie 2017 18:50:50
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair
 
using namespace std;
 
const string name = "abc2",
             in_file = name + ".in",
             out_file = name + ".out";
 
ifstream fin(in_file);
ofstream fout(out_file);
 
string str;
unordered_map<unsigned, bool> hash_table;
unsigned length_word;
unsigned power3[21];

unsigned add_letter(unsigned nr, unsigned digit) {
	unsigned temp = nr / power3[length_word - 1];
	nr -= temp * power3[length_word - 1];
	nr *= 3;
	nr += digit;
	return nr;
}

void process_word(string& word) {
	unsigned current_number = 0;
	for (unsigned i = 0; i < length_word; i++) {
		current_number = add_letter(current_number, word[i] - 'a');
	}
	hash_table[current_number] = true;
}

int main() {
	fin >> str;
	
	power3[0] = 1;
	for (unsigned i = 1; i <= 20; i++) {
		power3[i] = 3 * power3[i - 1]; 
	}

	string word;
	while (fin >> word) {
		if (!length_word) {
			length_word = word.size();
			if (length_word > str.size()) {
				fout << 0;
				return 0;
			}
		}
		process_word(word);
	}	

	int sol = 0;
	unsigned current_number = 0;
	for (unsigned i = 0; i < str.size(); i++) {
		current_number = add_letter(current_number, str[i] - 'a');
		if (i + 1 >= length_word) {
			if (hash_table.count(current_number)) {
				sol++;
			}
		}
	}
	
	fout << sol;
	return 0;
}