Cod sursa(job #2662117)

Utilizator Iulia25Hosu Iulia Iulia25 Data 23 octombrie 2020 15:56:34
Problema Trie Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct Trie  {
	int nr, sf;
	Trie *fiu[26];
	Trie()  {
    nr = sf = 0;
    for (int i = 0; i < 26; ++i)
      fiu[i] = NULL;
	}
} *T;

void adaug(string s, int semn)  {
	Trie *aux = T;
	aux -> nr += semn;
	for (int i = 0; i < s.size(); ++i)  {
		int c = s[i] - 'a';
		if (aux -> fiu[c] == NULL)  {
			Trie* auxf = new Trie;
			aux -> fiu[c] = auxf;
		}
		aux = aux -> fiu[c];
		aux -> nr += semn;
	}
	aux -> sf += semn;
}

int nr_aparitii(string s)  {
	Trie *aux = T;
	for (int i = 0; i < s.size(); ++i)  {
		int c = s[i] - 'a';
		if(aux -> fiu[c] == NULL)  {
			return 0;
		}
		aux = aux -> fiu[c];
	}
	return aux -> sf;
}

int cmlpc(string s)  {
	int ans = 0;
	Trie *aux = T;
	for (int i = 0; i < s.size(); ++i)  {
		int c = s[i] - 'a';
		if (aux -> fiu[c] == NULL)
			return ans;
		aux = aux -> fiu[c];
		if (aux -> nr > 0 && i < s.size() - 1 || i == s.size() - 1 && aux -> nr > 1)
			ans = i + 1;
	}
	return ans;
}

int main()  {
	int type;
	string s = "";
	T = new Trie;
	while (fin >> type >> s)  {
		switch(type)  {
		case 0:
			adaug(s, 1);
			break;
		case 1:
			adaug(s, -1);
			break;
		case 2:
			fout << nr_aparitii(s) << '\n';
			break;
		case 3:
			fout << cmlpc(s) << '\n';
			break;
		}
	}
	return 0;
}