Cod sursa(job #2313634)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 11:35:13
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
//#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <iomanip>
#include <stack>
#include <string.h>
#include <set>

using namespace std;

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

struct Trie
{
	int apps;
	int word;

	Trie *next[27];
	Trie *father;

	Trie()
	{
		for(int i = 0; i <= 26; i++)
			next[i] = nullptr;

		apps = word = 0;
	}

	void add(string word)
	{
		Trie *curr = this;

		for(int i = 0; i < word.size(); i++)
		{
			if(curr -> next[word[i] - 'a'] == nullptr)
			{
				curr -> next[word[i] - 'a'] = new Trie;
			}

			curr = curr -> next[word[i] - 'a'];
			curr -> apps++;
		}

		curr -> word++;
	}

	void erase(string word, int pos = 0)
	{
		Trie *curr = this;

		if(pos == word.size())
		{
			curr -> word--;
		}
		else
		{
			curr -> next[word[pos] - 'a'] -> erase(word, pos + 1);
		}

		if(pos != 0)
		{
			curr -> apps--;

			if(curr -> next[word[pos] - 'a'] == 0)
			{
				delete curr -> next[word[pos] - 'a'];

				curr -> next[word[pos] - 'a'] = nullptr;
			}
		}
	}

	int find(string word)
	{
		Trie *curr = this;

		for(int i = 0; i < word.size(); i++)
		{
			if(curr -> next[word[i] - 'a'] == nullptr)
				return 0;

			curr = curr -> next[word[i] - 'a'];
		}

		return curr -> word;
	}

	int lcp(string word)
	{
		Trie *curr = this;

		for(int i = 0; i < word.size(); i++)
		{
			if(curr -> next[word[i] - 'a'] == nullptr || curr -> next[word[i] - 'a'] -> apps <= 0)
				return i;

			curr = curr -> next[word[i] - 'a'];
		}

		return word.size();
	}
};

Trie *trie = new Trie;

int main()
{
	int op;
	string word;

	while(in >> op >> word)
	{
		switch(op)
		{
			case(0):
				trie -> add(word);
				break;
			case(1):
				trie -> erase(word);
				break;
			case(2):
				out << trie -> find(word) << '\n';
				break;
			case(3):
				out << trie -> lcp(word) << '\n';
				break;
		}
	}
}