Cod sursa(job #3146553)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 21 august 2023 16:15:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kS = 26;

struct trie {
	struct Node {
		int cnt, frq, link[kS];
		Node(int cnt = 0, int frq = 0): cnt(cnt), frq(frq) {
			memset(link, -1, sizeof(link));
		}
	};
	const Node root = Node();
	vector<Node> ptr;
	trie() {
		init();
	}
	void init() {
		ptr.clear();
		ptr.emplace_back(root);
	}
	void insert(const string &s, int idx = 0, int root = 0) {
		int ord = s[idx] - 'a';
		if(ptr[root].link[ord] == -1) {
			ptr.emplace_back(Node());
			ptr[root].link[ord] = ptr.size() - 1;
		}
		int nxt = ptr[root].link[ord];
		ptr[nxt].frq++;
		if(idx == (int) s.size() - 1) {
			ptr[nxt].cnt++;
		} else {
			insert(s, idx + 1, nxt);
		}
	}
	void erase(const string &s, int idx = 0, int root = 0) {
		int ord = s[idx] - 'a';
		int nxt = ptr[root].link[ord];
		ptr[nxt].frq--;
		if(idx == (int) s.size() - 1) {
			ptr[nxt].cnt--;
		} else {
			erase(s, idx + 1, nxt);
		}
	}
	int count(const string &s, int idx = 0, int root = 0) {
		int ord = s[idx] - 'a';
		if(ptr[root].link[ord] == -1) {
			return 0;
		}
		int nxt = ptr[root].link[ord];
		if(ptr[nxt].frq == 0) {
			return 0;
		}
		if(idx == (int) s.size() - 1) {
			return ptr[nxt].cnt;
		}
		return count(s, idx + 1, nxt);
	}
	int prefix(const string &s, int idx = 0, int root = 0) {
		int ord = s[idx] - 'a';
		if(ptr[root].link[ord] == -1) {
			return idx;
		}
		int nxt = ptr[root].link[ord];
		if(ptr[nxt].frq == 0) {
			return idx;
		}
		if(idx == (int) s.size() - 1) {
			return s.size();
		}
		return prefix(s, idx + 1, nxt);
	}
};

int main() {
	int t;
	string s;
	trie ds;
	while(fin >> t >> s) {
		if(t == 0) {
			ds.insert(s);
		} else if(t == 1) {
			ds.erase(s);
		} else if(t == 2) {
			fout << ds.count(s) << '\n';
		} else if(t == 3) {
			fout << ds.prefix(s) << '\n';
		}
	}
	return 0;
}