Pagini recente » Cod sursa (job #1690000) | Cod sursa (job #1959219) | Cod sursa (job #2679312)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int cnt;
int nr;
Trie *fiu[26];
Trie()
{
cnt = 0;
nr = 0;
for(int i = 0; i < 26; ++i)
fiu[i] = 0;
}
};
Trie *root;
void insert(Trie *trie, int poz , string w)
{
if(poz == w.size())
{trie->nr++;return;}
int x = w[poz] -'a';
if(trie->fiu[x] == NULL)
trie->fiu[x] = new Trie, trie->cnt++;
insert(trie->fiu[x] , poz + 1 , w);
}
bool erase(Trie *trie, int poz , string w)
{
if(poz == w.size())
trie->nr--;
else
{
int x = w[poz] - 'a';
if(erase(trie->fiu[x] , poz + 1 , w))
trie->fiu[x] = 0, trie->cnt--;
}
if(trie->cnt == 0 && trie->nr == 0 && trie != root)
return 1;
return 0;
}
int searchw(Trie *trie , int poz , string w)
{
if(poz == w.size())
return trie->nr;
int x = w[poz] - 'a';
if(trie->fiu[x] == NULL)
return 0;
return searchw(trie->fiu[x] , poz + 1, w);
}
int search(Trie *trie , int poz , string w)
{
if(poz == w.size())
return poz;
int x = w[poz] - 'a';
if(trie->fiu[x] == NULL)
return poz;
return search(trie->fiu[x] , poz + 1, w);
}
int main()
{
char c;
string w;
root = new Trie;
while(in >> c >> w)
{
if(c == '0')
insert(root , 0 , w);
if(c == '1')
erase(root , 0 , w);
if(c == '2')
out << searchw(root , 0 , w) << '\n';
if(c == '3')
out << search(root , 0 , w) << '\n';
}
return 0;
}