Pagini recente » Cod sursa (job #2100756) | Cod sursa (job #1543570) | Cod sursa (job #1401961) | Cod sursa (job #1802592) | Cod sursa (job #1909368)
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char s[30];
struct Trie
{
int nr_cuv;
int nr_fii;
Trie *fiu[30];
Trie()
{
nr_cuv = nr_fii = 0;
for(int i = 0; i < 26; ++i) fiu[i] = 0;
}
};
Trie *T = new Trie;
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))
{
nod -> fiu[ch] = 0;
nod -> nr_fii--;
}
}
if(nod -> nr_fii == 0 && nod -> nr_cuv == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
inline int Query(Trie *nod, char *s)
{
if(*s == 0) return nod -> nr_cuv;
return Query(nod -> fiu[ch],s+1);
}
inline int Prefix(Trie *nod, char *s, int len)
{
if(*s == 0 || nod -> fiu[ch] == 0) return len;
return Prefix(nod -> fiu[ch],s+1,len+1);
}
int main()
{
int tip;
while(fin >> tip >> s)
{
if(!tip) Add(T,s);
if(tip == 1) Delete(T,s);
if(tip == 2) fout << Query(T,s) << "\n";
if(tip == 3) fout << Prefix(T,s,0) << "\n";
}
fout.close();
return 0;
}