Pagini recente » Cod sursa (job #155607) | Cod sursa (job #2335352) | Cod sursa (job #3258800) | Cod sursa (job #3258161) | Cod sursa (job #3020937)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int r;
string s;
struct trie
{
int val,nr;
trie *a[30];
trie()
{
nr=val=0;
for(int i=0;i<=27;i++)
a[i]=0;
}
};
trie *t =new trie;
void add(trie *nod,int poz,string s)
{
if(poz==s.size())
{
nod->val++;
return;
}
int ch=s[poz]-'a';
if(!nod->a[ch])
{
nod->a[ch]=new trie;
nod->nr++;
}
add(nod->a[ch],poz+1,s);
}
bool deletee(trie *nod,int poz,string s)
{
if(poz==s.size())
{
nod->val--;
}
else
{
int ch=s[poz]-'a';
if(deletee(nod->a[ch],poz+1,s))
{
nod->nr--;
nod->a[ch]=NULL;
}
}
if(nod->nr==0&&nod->val==0&&nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int apar(trie *nod,int poz,string s)
{
if(poz==s.size())
return nod->val;
int ch=s[poz]-'a';
if(!nod->a[ch])
return 0;
else
return apar(nod->a[ch],poz+1,s);
}
int prefix(trie *nod,int poz,string s)
{
if(poz==s.size())
return poz;
int ch=s[poz]-'a';
if(!nod->a[ch])
return poz;
else
return prefix(nod->a[ch],poz+1,s);
}
int main()
{
while(f>>r>>s)
{
if(r==0)
add(t,0,s);
else
if(r==1)
deletee(t,0,s);
else
if(r==2)
g<<apar(t,0,s)<<'\n';
else
g<<prefix(t,0,s)<<'\n';
}
return 0;
}