Pagini recente » Cod sursa (job #2029859) | Cod sursa (job #943123) | Cod sursa (job #3230877) | Cod sursa (job #1637085) | Cod sursa (job #2268348)
#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--;
for (int i=0;i<s.size();i++)
{
if (node->children[pos(s[i])]==NULL)
return;
node=node->children[pos(s[i])];
node->num--;
}
}
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';
}
}