Pagini recente » Cod sursa (job #3249342) | Cod sursa (job #2941309) | Cod sursa (job #2105360) | Cod sursa (job #378103) | Cod sursa (job #2986991)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int t;
string s;
struct trie
{
int nr,val;
trie *a[30];
trie()
{
for(int i=0;i<27;i++)
a[i]=0;
nr=val=0;
}
};
trie *T=new trie;
void add(trie *nod,string s,int poz,int n)
{
if(poz==n)
{
nod->nr++;
return;
}
int fiu=s[poz]-'a';
if(!nod->a[fiu])
{
nod->val++;
nod->a[fiu]=new trie;
}
add(nod->a[fiu],s,poz+1,n);
}
bool _erase(trie *nod,string s,int poz,int n)
{
if(poz==n)
{
nod->nr--;
}
else
{
int fiu=s[poz]-'a';
if(_erase(nod->a[fiu],s,poz+1,n))
{
nod->val--;
nod->a[fiu]=0;
}
}
if(nod->val==0&&nod->nr==0&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
void tipar(trie *nod,string s,int poz,int n)
{
int fiu=s[poz]-'a';
if(poz==n)
{
g<<nod->nr<<'\n';
return;
}
if(!nod->a[fiu])
{
g<<0<<'\n';
return;
}
tipar(nod->a[fiu],s,poz+1,n);
}
void prefix(trie *nod,string s,int poz,int n)
{
int fiu=s[poz]-'a';
if(poz==n||!nod->a[fiu])
{
g<<poz<<'\n';
return;
}
else
prefix(nod->a[fiu],s,poz+1,n);
}
int main()
{
while(f>>t>>s)
{
if(t==0)
add(T,s,0,s.size());
else
if(t==1)
_erase(T,s,0,s.size());
else
if(t==2)
tipar(T,s,0,s.size());
else
prefix(T,s,0,s.size());
}
return 0;
}