Pagini recente » Rating Vlad Vlad (VladuZ1338) | Rating Theodor Stoican (theo.stoican) | Cod sursa (job #2956204) | Cod sursa (job #2840238) | Cod sursa (job #3294747)
#include <bits/stdc++.h>
using namespace std;
struct Trie
{
char curr;
int ap=0;
vector <Trie> kids;
}dad;
void add_word(string word)
{
int i=0, sz=word.size();
Trie* curr=&dad;
while(i<sz)
{
bool gasit=false;
for(auto &urmas:curr->kids)
{
if(urmas.curr==word[i])
{
urmas.ap++;
curr=&urmas;
i++;
gasit=true;
break;
}
}
if(!gasit)
{
curr->kids.push_back({word[i], 1, {}});
curr=&curr->kids.back();
i++;
}
}
}
void remove_word(string word)
{
int i=0, sz=word.size();
Trie* curr=&dad;
while(i<sz)
{
int id=0;
for(auto &urmas:curr->kids)
{
if(urmas.curr==word[i])
{
urmas.ap--;
i++;
if(urmas.ap==0)
{
curr->kids.erase(curr->kids.begin()+id);
return;
}
curr=&urmas;
break;
}
id++;
}
}
}
int count_word(string word)
{
int i=0, sz=word.size();
Trie curr=dad;
while(i<sz)
{
bool gasit=false;
for(auto urmas:curr.kids)
{
if(urmas.curr==word[i])
{
i++;
curr=urmas;
gasit=true;
break;
}
}
if(!gasit) return 0;
}
int ans=curr.ap;
for(auto urmas:curr.kids)
{
ans-=urmas.ap;
}
return ans;
}
int longest_prefix(string word)
{
int i=0, sz=word.size(), ans=0;
Trie curr=dad;
while(i<sz)
{
bool gasit=false;
for(auto urmas:curr.kids)
{
if(urmas.curr==word[i])
{
gasit=true;
ans++;
i++;
curr=urmas;
break;
}
}
if(!gasit) return ans;
}
return ans;
}
int main()
{
ifstream cin("trie.in");
ofstream cout("trie.out");
int type;
string word;
while(cin>>type>>word)
{
if(type==0) add_word(word);
if(type==1) remove_word(word);
if(type==2) cout<<count_word(word)<<'\n';
if(type==3) cout<<longest_prefix(word)<<'\n';
}
return 0;
}