Pagini recente » Cod sursa (job #511326) | Cod sursa (job #1516074) | Cod sursa (job #2317520) | Cod sursa (job #1021542) | Cod sursa (job #2605321)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class TRIE{
private:
int frec, cntsons;
TRIE* sons[26];
public:
TRIE(){
memset(sons, 0, sizeof(sons));
cntsons = frec = 0;
}
void ADD(string word, int pz){
int val = word[pz] - 'a';
if(!sons[val]){
++cntsons;
sons[val] = new TRIE;
}
if(pz == word.size() - 1)
++sons[val]->frec;
else sons[val]->ADD(word, pz + 1);
}
void ERASE(string word, int pz){
int val = word[pz] - 'a';
if(pz == word.size() - 1)
--sons[val]->frec;
else sons[val]->ERASE(word, pz + 1);
if(sons[val]->frec == 0 && sons[val]->cntsons == 0){
delete sons[val];
sons[val] = 0;
--cntsons;
}
}
int COUNT(string word, int pz){
int val = word[pz] - 'a';
if(sons[val]){
if(pz == word.size() - 1)
return sons[val]->frec;
else return sons[val]->COUNT(word, pz + 1);
}
else return 0;
}
int LCMPREFIX(string word, int pz){
int val = word[pz] - 'a';
if(sons[val] && pz < word.size())
return sons[val]->LCMPREFIX(word, pz + 1);
else return pz;
}
};
TRIE *root = new TRIE;
int main()
{
int op;
string s;
while(fin >> op >> s){
if(op == 0)
root->ADD(s, 0);
else if(op == 1)
root->ERASE(s, 0);
else if(op == 2)
fout << root->COUNT(s, 0) << '\n';
else fout << root->LCMPREFIX(s, 0) << '\n';
}
return 0;
}