Pagini recente » Cod sursa (job #2616876) | mafia | Cod sursa (job #1593347) | Cod sursa (job #1556330) | Cod sursa (job #3281774)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class TrieNode{
private:
TrieNode *edg[26];
int wordsEnded;
int subtreeSize;
public:
TrieNode(){
memset(edg, 0, sizeof(edg));
wordsEnded = 0;
subtreeSize = 0;
}
void addWord(const string &s, int depth=0){
subtreeSize++;
if(depth==s.size())
{
wordsEnded++;
return;
}
int nextLetterIdx=s[depth]-'a';
if(edg[nextLetterIdx]==nullptr){
edg[nextLetterIdx]= new TrieNode();
}
edg[nextLetterIdx] -> addWord(s, depth+1);
}
void removeWord(const string &s, int depth=0){
if(subtreeSize == 0) return;
subtreeSize--;
if(depth==s.size())
{
wordsEnded--;
return;
}
int nextLetterIdx=s[depth]-'a';
if (edg[nextLetterIdx] != nullptr) {
edg[nextLetterIdx]->removeWord(s, depth + 1);
}
}
int countWord(const string &s, int depth=0){
if(depth==s.size())
{
return wordsEnded;
}
int nextLetterIdx=s[depth]-'a';
if (edg[nextLetterIdx] != nullptr) {
return edg[nextLetterIdx]->countWord(s, depth + 1);
}
return 0;
}
int lcp(const string &s, int depth=0){
if(depth==s.size())
return depth;
if(subtreeSize==0)
return depth;
int nextLetterIdx=s[depth]-'a';
if (edg[nextLetterIdx] != nullptr && edg[nextLetterIdx]->subtreeSize > 0) {
return edg[nextLetterIdx]->lcp(s, depth + 1);
}
return depth;
}
};
ifstream fin("trie.in");
ofstream fout("trie.out");
int main()
{
int q;
string s;
TrieNode rt;
while(fin >> q >> s)
{
if(q==0)
rt.addWord(s);
else if(q==1)
rt.removeWord(s);
else if(q==2)
fout << rt.countWord(s) << '\n';
else
fout << rt.lcp(s) << '\n';
}
return 0;
}