Pagini recente » Cod sursa (job #455545) | Cod sursa (job #1123364) | Cod sursa (job #1381676) | Cod sursa (job #1552123) | Cod sursa (job #950930)
Cod sursa(job #950930)
#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){
add(x,0);
}
void remove(string &x){
remove(x,0);
}
int hasWord(string &x){
return hasWord(x,0);
}
int& prefix(string& x){
int result=0;
return prefix(x,result);
}
private:
void add(string& x,int pos){
words++;
if(x.size()==pos){
endWord++;
return;
}
if(links.count(x[pos])==0){
links[x[pos]]=new Trie();
}
links[x[pos]]->add(x,pos+1);
}
void remove(string& x,int pos){
words--;
if(words==0){
links.clear();
}
if(x.size()==pos){
endWord--;
return;
}
if(links.count(x[pos])>0){
links[x[pos]]->remove(x,pos+1);
}
return;
}
int hasWord(string& x,int pos){
if(x.size()==pos){
return endWord;
}
if(links.count(x[pos])>0){
return links[x[pos]]->hasWord(x,pos+1);
}
return 0;
}
int& prefix(string& x,int& result){
if(!x.size() && words){
return result;
}
if(!words){
result--;
}
char letter=x[result];
if(links.count(letter)>0){
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;
}