Cod sursa(job #3120637)

Utilizator FastmateiMatei Mocanu Fastmatei Data 7 aprilie 2023 20:31:50
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include<set>
#include<queue>

using namespace std;

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


struct trie
{
	trie* child[26];
	int cnt;
	int nrAp;
};

trie* head;

void TrieInsert(string s)
{
	trie* p = head;
	int len = s.length();
	for (int i = 0; i < len; i++)
		if (p->child[s[i] - 'a'] != 0)
		{
			p->nrAp++;
			p = p->child[s[i] - 'a'];
		}
		else
		{
			trie* q = new trie();
			p->child[s[i] - 'a'] = q;
			p->nrAp++;
			p = p->child[s[i] - 'a'];
		}
	p->cnt++;
	p->nrAp++;
}

void TrieDelete(string s)
{
	trie* p = head;
	trie* last = head;
	int len = s.length();
	for (int i = 0; i < len; i++)
	{
		p->nrAp--;
		trie* q = p;
		p = p->child[s[i] - 'a'];
		if (q->nrAp == 0 && q != head)
		{
			delete q;
			last->child[s[i - 1] - 'a'] = nullptr;
		}
		else last = q;
	}
	p->nrAp--;
	p->cnt--;
	if (p->nrAp == 0)
	{
		delete p;
		last->child[s[len - 1] - 'a'] = nullptr;
	}
}

int TrieAparitii(string s)
{
	trie* p = head;
	int len = s.length();
	for (int i = 0; i < len; i++)
	{
		if (!p->child[s[i] - 'a']) return 0;
		p = p->child[s[i] - 'a'];
	}
	return p->cnt;
}

int TrieLongestCommonPrefix(string s)
{
	trie* p = head;
	int len = s.length();
	int cnt = 0;
	for (int i = 0; i < len; i++)
	{
		if (!p->child[s[i] - 'a']) return cnt;
		cnt++;
		p = p->child[s[i] - 'a'];
	}
	return cnt;
}

int main()
{
	head = new trie();
	int op;
	string s;
	while (fin >> op >> s)
	{
		if (op == 0) TrieInsert(s);
		else if (op == 1) TrieDelete(s);
		else if (op == 2) fout << TrieAparitii(s) << "\n";
		else fout << TrieLongestCommonPrefix(s) << "\n";
	}
}