Pagini recente » Cod sursa (job #1207426) | Cod sursa (job #683545) | Cod sursa (job #1067048) | Cod sursa (job #2699995) | Cod sursa (job #1377473)
#include <fstream>
#include <cstring>
using namespace std;
int lung, res, tip;
char sir[25], com;
struct trie
{
int count, son;
trie *fiu[26];
trie ()
{
count=0; son=0;
for(int i=0; i<26; ++i)
fiu[i]=0;
}
};
trie *root = new trie;
void insert(trie *node, int poz)
{
if(poz==lung)
{
node -> count ++;
}
else
{
int x=(int)sir[poz]-97;
if(!(node -> fiu[x]))
{
node -> fiu[x] = new trie;
node -> son ++;
}
insert(node -> fiu[x], poz+1);
}
}
int sterge(trie *node, int poz)
{
if(poz==lung)
{
node -> count--;
}
else
{
int x=(int)sir[poz]-97;
short deleted;
deleted=sterge(node->fiu[x], poz+1);
if(deleted)
{
node->son--;
node->fiu[x]=0;
}
}
if(!(node -> count)&&node!=root&&!(node->son))
{
delete node;
return 1;
}
return 0;
}
int afisare(trie *node, int poz)
{
if(poz==lung)
{
return node->count;
}
else
{
int x = (int)sir[poz]-97;
if(node->fiu[x])
return afisare(node->fiu[x], poz+1);
return 0;
}
}
void longest_prefix(trie *node, int poz)
{
if(poz<lung)
{
int x=(int)sir[poz]-97;
if( node -> fiu[x])
{
res++;
longest_prefix(node -> fiu[x], poz+1);
}
}
}
int main()
{
ifstream in("trie.in");
ofstream out("trie.out");
while(!in.eof())
{
com=in.get();
in.get();
in.get(sir, 20);
lung=strlen(sir);
in.get();
tip=(int)com-48;
if(tip==0)
{
insert(root, 0);
}
else if(tip==1)
{
sterge(root, 0);
}
else if(tip==2)
{
out<<afisare(root, 0)<<"\n";
}
else if(tip==3)
{
res=0;
longest_prefix(root, 0);
out<<res<<"\n";
}
}
in.close();
out.close();
return 0;
}