Pagini recente » Cod sursa (job #414525) | Cod sursa (job #1050265) | Cod sursa (job #1544889) | Cod sursa (job #1710326) | Cod sursa (job #1451567)
#include<fstream>
#include<string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
string s;
struct Trie{
int cnt,ap;
Trie *fiu[30];
Trie(){
cnt = ap = 0;
for(int i = 0; i < 26 ; ++i)
fiu[i] = 0;
}
};
Trie *trie = new Trie;
void ins(Trie *nod,int poz)
{
if(s.size() == poz){
nod->cnt++;
return;
}
if(nod->fiu[s[poz]-'a'] == 0){
nod->fiu[s[poz] - 'a'] = new Trie;
nod->ap++;
}
ins(nod->fiu[s[poz]-'a'],poz + 1);
}
int del(Trie *nod,int poz)
{
if(s.size() == poz)
nod->cnt--;
else if(del(nod->fiu[s[poz]-'a'],poz + 1)){
nod->fiu[s[poz]-'a'] = 0;
nod->ap--;
}
if(nod->cnt == 0 && nod->ap == 0 && nod != trie){
delete nod;
return 1;
}
return 0;
}
int q1(Trie *nod,int poz){
if(s.size() == poz)
return nod->cnt;
if(nod->fiu[s[poz]-'a'])
return q1(nod->fiu[s[poz]-'a'],poz + 1);
return 0;
}
int q2(Trie *nod,int poz,int rez)
{
if(s.size() == poz || nod->fiu[s[poz]-'a'] == 0)
return rez;
return q2(nod->fiu[s[poz]-'a'],poz + 1,rez + 1);
}
int main()
{
int query;
while(in>>query){
in>>s;
if(query == 0)
ins(trie,0);
else if(query == 1)
del(trie,0);
else if(query == 2)
out<<q1(trie,0)<<"\n";
else
out<<q2(trie,0,0)<<"\n";
}
return 0;
}