Pagini recente » Rating Iorga Dan ANdrei (collector) | Cod sursa (job #3298220)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int max_litere=26;
const int max_nod= 200000;
struct TrieNode{
int n[max_litere];
int prefix;
int nr_word;
TrieNode (){
memset(n,0,sizeof(n));
prefix=0;
nr_word=0;
}
};
TrieNode trie[max_nod];
int node_count=1;
void insert(const string& word){
int node=0;
for(char c: word){
int i=c-'a';
if(trie[node].n[i]==0){
trie[node].n[i]=node_count++;
}
node=trie[node].n[i];
trie[node].prefix++;
}
trie[node].nr_word++;
}
void erase(const string& word){
int node=0;
for(char c: word){
int i=c-'a';
node=trie[node].n[i];
trie[node].prefix--;
}
trie[node].nr_word--;
}
int count(const string& word){
int node=0;
for(char c: word){
int i=c-'a';
if(trie[node].n[i]==0){
return 0;
}
node=trie[node].n[i];
}
return trie[node].nr_word;
}
int Prefix(const string& word){
int node=0;
int l=0;
for(char c: word){
int i=c-'a';
if(trie[node].n[i]==0 || trie[trie[node].n[i]].prefix==0){
break;
}
node=trie[node].n[i];
l++;
}
return l;
}
int main(){
int t;
string word;
while(fin>>t>>word){
if(t==0) insert(word);
else if(t==1) erase(word);
else if(t==2) fout<<count(word)<<endl;
else if(t==3) fout<<Prefix(word)<<endl;
}
}