Pagini recente » Cod sursa (job #1706080) | Cod sursa (job #2811827) | Cod sursa (job #3038366) | Cod sursa (job #1914289) | Cod sursa (job #1740635)
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int nr_cuv;
int nr_fii;
Trie *fiu[30];
Trie()
{
nr_cuv = 0;
nr_fii = 0;
for(int i = 0; i < 26; i++) fiu[i] = 0;
}
};
Trie *T = new Trie;
char s[30];
inline void Add(Trie *nod, char *s)
{
if(*s == 0)
{
nod -> nr_cuv ++;
return;
}
if(nod -> fiu[ch] == 0)
{
nod -> fiu[ch] = new Trie;
nod -> nr_fii++;
}
Add(nod -> fiu[ch], s+1);
}
inline bool Delete(Trie *nod, char *s)
{
if(*s == 0) nod -> nr_cuv --;
else
{
if(Delete(nod -> fiu[ch],s+1) == 1)
{
nod -> nr_fii --;
nod -> fiu[ch] = 0;
}
}
if(nod -> nr_fii == 0 && nod -> nr_cuv == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
inline int Search(Trie *nod, char *s)
{
if(*s == 0) return nod -> nr_cuv;
if(nod -> fiu[ch] != 0) return Search(nod -> fiu[ch], s+1);
return 0;
}
inline int LGP(Trie *nod, char *s, int len)
{
if(*s == 0 || nod ->fiu[ch] == 0) return len;
return LGP(nod -> fiu[ch], s+1, len+1);
}
int main()
{
int tip;
while(fin >> tip >> s)
{
if(tip == 0) Add(T,s);
else if(tip == 1) Delete(T,s);
else if(tip == 2) fout << Search(T,s) << "\n";
else fout << LGP(T,s,0) << "\n";
}
fout.close();
return 0;
}