Pagini recente » Cod sursa (job #1295333) | Cod sursa (job #1423745) | Cod sursa (job #2918743) | Cod sursa (job #2265585) | Cod sursa (job #2596698)
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
ifstream fin("trie.in"); ofstream fout("trie.out");
vector<vector<pair<int,pair<char, int> > > > trie;
void trie_insert(string s, int p){
for(int i=0; i<trie[p].size(); i++ ){
if(trie[p][i].sc.ft==s[0] ){
if(s.length()>0 ){
string k=s;
k.erase(k.begin(), k.begin()+1);
trie_insert(k, trie[p][i].sc.sc);
return ;}
else{
trie[p][i].ft++;
return ;
}
}
}
if(s.length()>0){
trie.resize(trie.size()+1 );
trie[p].pb(mp(0, mp(s[0], trie.size()-1) ) );
string k=s;
k.erase(k.begin(), k.begin()+1);
trie_insert(k, trie[p].back().sc.sc );
}
else{
trie.resize(trie.size()+1 );
trie[p].pb(mp(1, mp(s[0], trie.size()-1 ) ) );
}
}
void trie_delete(string s, int p){
for(int i=0; i<trie[p].size(); i++){
if(s[0]==trie[p][i].sc.ft){
if(s.size()>0){
string k=s; k.erase(k.begin(), k.begin()+1 );
trie_delete(k, trie[p][i].sc.sc );
if( trie[trie[p][i].sc.sc].size()<=0){
if(trie[p][i].ft<=0){
trie[p].erase(trie[p].begin()+i, trie[p].begin()+i+1 );
}
}
}
else{
trie[p][i].ft--;
if(trie[p][i].ft<=0){
trie[p].erase(trie[p].begin()+i, trie[p].begin()+i+1 );
}
}
return ;
}
}
}
int trie_aparitii(string s, int p){
for(int i=0; i<trie[p].size(); i++){
if(s[0]==trie[p][i].sc.ft){
if(s.length()>0){
string k=s; k.erase(k.begin(), k.begin()+1);
return trie_aparitii(k, trie[p][i].sc.sc );
}
else{
return trie[p][i].ft;
}
}
}
return 0;
}
int trie_prefix(string s, int p){
int res=0;
for(int i=0; i<trie[p].size(); i++){
if(trie[p][i].sc.ft==s[0] && trie[trie[p][i].sc.sc ].size()>0 ){
if(s.length()>0 ){
string k=s; k.erase(k.begin(), k.begin()+1);
res++;
res+=trie_prefix(k, trie[p][i].sc.sc);
}
else{
res++;
}
return res;
}
}
return res;
}
int main(){
trie.resize(1);
while(!fin.eof()){
string s;
int o;
fin>>o>>s;
if(o==0){
trie_insert(s, 0);
}
if(o==1){
trie_delete(s, 0);
}
if(o==2){
fout<<trie_aparitii(s, 0)<<"\n";
}
if(o==3){
fout<<trie_prefix(s, 0)<<"\n";
}
}
return 0;
}