Pagini recente » Cod sursa (job #134103) | Cod sursa (job #237778) | Cod sursa (job #2460583) | Cod sursa (job #1082823) | Cod sursa (job #2309027)
//#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[30];
Trie *father;
Trie()
{
for(int i = 0; i < 30; 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)
{
Trie *curr = this;
for(int i = 0; i < word.size(); i++)
{
curr = curr -> next[word[i] - 'a'];
curr -> apps--;
}
curr -> word--;
}
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;
}
}
}