Pagini recente » Cod sursa (job #2196755) | Cod sursa (job #2221118) | Cod sursa (job #38613) | Cod sursa (job #1896075) | Cod sursa (job #2268447)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Trie
{
int num;
Trie* children[26];
Trie()
{
num=0;
for (int i=0;i<26;i++)
children[i]=NULL;
}
};
Trie* root;
int pos(char c)
{
return c-'a';
}
void insert_word(string s)
{
Trie* node=root;
node->num++;
for (int i=0;i<s.size();i++)
{
if (node->children[pos(s[i])]==NULL)
{
Trie* nw=new Trie();
node->children[pos(s[i])]=nw;
}
node=node->children[pos(s[i])];
node->num++;
}
}
void delete_word(string s)
{
Trie* node=root;
node->num--;
int i;
for (i=0;i<s.size();i++)
{
if (node->children[pos(s[i])]==NULL)
return;
if (node->children[pos(s[i])]->num==1)
break;
node=node->children[pos(s[i])];
node->num--;
}
if (i==s.size())
return;
Trie* tmp=node->children[pos(s[i])], *nxt;
node->children[pos(s[i])]=NULL;
for (i++;i<=s.size();i++)
{
if (i==s.size())
{
delete tmp;
}
else
{
nxt=tmp->children[pos(s[i])];
delete tmp;
tmp=nxt;
}
}
}
int find_word(string s)
{
Trie* node=root;
//cout<<" -- ";
for (int i=0;i<s.size();i++)
{
if (node->children[pos(s[i])]==NULL)
return 0;
node=node->children[pos(s[i])];
}
int sum=0;
for (int i=0;i<26;i++)
if (node->children[i]!=NULL)
sum+=node->children[i]->num;
return node->num-sum;
}
int longest_prefix(string s)
{
int len=0;
Trie* node=root;
for (int i=0;i<s.size();i++)
{
if (node->children[pos(s[i])]==NULL || node->children[pos(s[i])]->num==0)
return len;
len++;
node=node->children[pos(s[i])];
}
return len;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
string s;
int a;
root=new Trie;
while (f>>a)
{
f>>s;
if (a==0)
insert_word(s);
if (a==1)
delete_word(s);
if (a==2)
g<<find_word(s)<<'\n';
if (a==3)
g<<longest_prefix(s)<<'\n';
}
}