Pagini recente » Cod sursa (job #782037) | Cod sursa (job #2184388) | Cod sursa (job #1293215) | Cod sursa (job #914078) | Cod sursa (job #950924)
Cod sursa(job #950924)
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie{
unordered_map<char,Trie*> links;
int endWord=0;
int words=0;
void add(string& x){
words++;
if(!x.size()){
endWord++;
return;
}
char letter=x[0];
if(links.count(letter)==0){
links[letter]=new Trie();
}
x.erase(x.begin());
links[letter]->add(x);
}
void remove(string& x){
words--;
if(words==0){
links.clear();
}
if(!x.size()){
endWord--;
return;
}
char letter=x[0];
if(links.count(letter)>0){
x.erase(x.begin());
links[letter]->remove(x);
return;
}
return;
}
int hasWord(string& x){
if(!x.size()){
return endWord;
}
char letter=x[0];
if(links.count(letter)>0){
x.erase(x.begin());
return links[letter]->hasWord(x);
}
return false;
}
int& prefix(string& x){
int result=0;
return prefix(x,result);
}
private:
int& prefix(string& x,int& result){
if(!x.size() && words){
return result;
}
if(!words){
result--;
}
char letter=x[0];
if(links.count(letter)>0){
x.erase(x.begin());
result++;
return links[letter]->prefix(x,result);
}
return result;
}
};
int main()
{
Trie trie;
int op;
string word;
while(in>>op){
in>>word;
if(op==0){
trie.add(word);
}
if(op==1){
trie.remove(word);
}
if(op==2){
out<<trie.hasWord(word)<<"\n";
}
if(op==3){
out<<trie.prefix(word)<<"\n";
}
}
return 0;
}