Pagini recente » Cod sursa (job #477356) | Cod sursa (job #3143126)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct Node{
Node* alph[30];
bool created[30];
int val;
int pr;
Node(){
for(int i=0;i<26;i++)
created[i]=false;
val=0;
pr=0;
}
};
struct Trie{
Node* head;
Trie(){
head=new Node();
}
void addString(string s){
int n=s.size();
Node* curr=head;
for(int i=0;i<n;i++){
curr->pr++;
if(curr->created[s[i]-'a']==false){
curr->created[s[i]-'a']=true;
curr->alph[s[i]-'a']=new Node();
}
curr=curr->alph[s[i]-'a'];
}
curr->val++;
curr->pr++;
}
int countString(string s){
int n=s.size();
Node* curr=head;
for(int i=0;i<n;i++){
if(curr->created[s[i]-'a']==false){
return 0;
}
curr=curr->alph[s[i]-'a'];
}
return curr->val;
}
void removeString(string s){
int n=s.size();
Node* curr=head;
for(int i=0;i<n;i++){
curr->pr--;
if(curr->created[s[i]-'a']==false){
curr->created[s[i]-'a']=true;
curr->alph[s[i]-'a']=new Node();
}
curr=curr->alph[s[i]-'a'];
}
curr->val--;
curr->pr--;
}
int prefixString(string s){
int n=s.size();
Node* curr=head;
for(int i=0;i<n;i++){
if(curr->created[s[i]-'a']==false or curr->alph[s[i]-'a']->pr==0){
return i;
}
curr=curr->alph[s[i]-'a'];
}
return n;
}
};
int main() {
Trie trie;
//trie.addString("gig");
//cout<<trie.prefixString("gp");
int cer;
string s;
while(cin>>cer>>s){
//cout<<s<<"\n";
if(cer==0){
trie.addString(s);
}
if(cer==1){
trie.removeString(s);
}
if(cer==2){
cout<<trie.countString(s)<<"\n";
}
if(cer==3){
cout<<trie.prefixString(s)<<"\n";
}
}
return 0;
}