Pagini recente » Cod sursa (job #3364287) | Cod sursa (job #3364186) | Cod sursa (job #3363500) | Cod sursa (job #3363669) | Cod sursa (job #3363292)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int nrCuv,nrAp;
Trie *fii[26];
Trie() {
nrCuv=nrAp=0;
for(int i=0; i<26; i++)fii[i]=nullptr;
}
void addWord(const string &s,int poz=0) {
int c=s[poz]-'a';
if(fii[c]==nullptr)fii[c]=new Trie();
fii[c]->nrAp++;
if(poz==s.size()-1)fii[c]->nrCuv++;
else fii[c]->addWord(s,poz+1);
}
void deleteWord(const string &s,int poz=0) {
int c=s[poz]-'a';
fii[c]->nrAp--;
if(poz==s.size()-1)fii[c]->nrCuv--;
else fii[c]->deleteWord(s,poz+1);
if(fii[c]->nrAp==0) {
delete fii[c];
fii[c]=nullptr;
}
}
int countAp(const string &s,int poz=0){
int c=s[poz]-'a';
if(fii[c]==nullptr)return 0;
if(poz==s.size()-1)return fii[c]->nrCuv;
return fii[c]->countAp(s,poz+1);
}
int longestPrefix(const string &s,int poz=0){
int c=s[poz]-'a';
if(fii[c]==nullptr)return 0;
if(poz==s.size()-1)return 1;
return 1+fii[c]->longestPrefix(s,poz+1);
}
};
int main() {
int op;
string s;
Trie T;
while(fin>>op>>s){
if(op==0)T.addWord(s);
else if(op==1)T.deleteWord(s);
else if(op==2)fout<<T.countAp(s)<<'\n';
else fout<<T.longestPrefix(s)<<'\n';
}
return 0;
}