Pagini recente » Cod sursa (job #1726646) | Cod sursa (job #2844725) | Cod sursa (job #2278093) | Cod sursa (job #1755130) | Cod sursa (job #791505)
Cod sursa(job #791505)
#include <cstdio>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;
struct trie {
int C,F;
trie *f[26];
trie(){
C=F=0;
memset(f,0,sizeof(f));
}
};
trie *T= new trie;
string s;
void add (trie *nd,int i)
{
if(i==s.size())
{
++(nd->C);
return;
}
if(nd->f[s[i]-'a']==0)
{
nd->f[s[i]-'a']=new trie;
++(nd->F);
}
add(nd->f[s[i]-'a'],i+1);
}
int del (trie *nd,int i)
{
if(i==s.size())
--(nd->C);
else
if(del(nd->f[s[i]-'a'],i+1))
{
nd->f[s[i]-'a']=0;
--(nd->F);
}
if(nd->C==0&&nd->F==0&&nd!=T)
{
delete nd;
return 1;
}
return 0;
}
int que (trie *nd,int i)
{
if(i==s.size())
return nd->C;
if(nd->f[s[i]-'a'])
return que(nd->f[s[i]-'a'],i+1);
return 0;
}
int pre (trie *nd,int i,int c)
{
if(i==s.size()||nd->f[s[i]-'a']==0)
return c;
return pre(nd->f[s[i]-'a'],i+1,c+1);
}
int main ()
{
ifstream in ("trie.in");
freopen ("trie.out","w",stdout);
for(int t;in>>t>>s;)
{
if(t==0)
add(T,0);
if(t==1)
del(T,0);
if(t==2)
printf("%d\n",que(T,0));
if(t==3)
printf("%d\n",pre(T,0,0));
}
return 0;
}