Pagini recente » Monitorul de evaluare | Cod sursa (job #127351) | Cod sursa (job #2402001) | Cod sursa (job #2905733) | Cod sursa (job #3041693)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int r;
struct trie
{
int nr,val;
trie *a[30];
trie()
{
nr=val=0;
for(int i=0;i<=27;i++)
a[i]=0;
}
};
void add(trie *nod,string s,int poz)
{
if(poz==s.size())
{
nod->val++;
return;
}
int fiu=s[poz]-'a';
if(!nod->a[fiu])
{
nod->a[fiu]=new trie;
nod->nr++;
}
add(nod->a[fiu],s,poz+1);
}
bool del(trie *nod,string s,int poz, trie *T)
{
if(s.size()==poz)
{
nod->val--;
}
else
{
int fiu=s[poz]-'a';
if(del(nod->a[fiu],s,poz+1,T))
{
nod->nr--;
nod->a[fiu]=NULL;
}
}
if(nod->nr==0&&nod->val==0)
{
delete nod;
return true;
}
return 0;
}
void apar(trie *nod,string s,int poz)
{
if(s.size()==poz)
{
g<<nod->val<<'\n';
return;
}
int fiu=s[poz]-'a';
if(!nod->a[fiu])
{
g<<0<<'\n';
return;
}
apar(nod->a[fiu],s,poz+1);
}
void pref(trie *nod,string s,int poz)
{
if(s.size()==poz)
{
g<<s.size()<<'\n';
return;
}
int fiu=s[poz]-'a';
if(nod->a[fiu]==NULL)
{
g<<poz<<'\n';
return;
}
pref(nod->a[fiu],s,poz+1);
}
int main()
{
string s;
trie *T=new trie;
while(f>>r>>s)
{
if(r==0)
add(T,s,0);
else
if(r==1)
del(T,s,0,T);
else
if(r==2)
apar(T,s,0);
else
pref(T,s,0);
}
return 0;
}