Pagini recente » Cod sursa (job #1209648) | Cod sursa (job #1191454) | Cod sursa (job #30003) | Cod sursa (job #205446) | Cod sursa (job #2266542)
#include <bits/stdc++.h>
using namespace std;
string s;
map <int,map <char,int>> ad;
map <int,int> nr, tat;
int ct = 1;
inline bool nu_exista_fiu(int nod, char ch){
return ad[nod][ch] == 0 || tat[ad[nod][ch]] != nod;
}
int get_nod(){
int nod = 0;
for(auto ch : s){
if(nu_exista_fiu(nod, ch)){
ad[nod][ch] = ct;
tat[ct++] = nod;
}
nod = ad[nod][ch];
}
return nod;
}
void sterge(int nod){
if(ad[nod].size() != 0)
return;
int nodp = nod;
while(nod != 0 && ad[nod].size() <= 1){
ad.erase(nod);
nodp = nod;
nod = tat[nod];
tat.erase(nodp);
nr.erase(nodp);
}
}
pair<int,int> query(){
int nod = 0;
for(int i = 0; i < s.size(); i++){
if(nu_exista_fiu(nod, s[i]))
return {0, i};
nod = ad[nod][s[i]];
}
return {nr[nod], s.size()};
}
ifstream fi("trie.in");
ofstream fo("trie.out");
int main()
{
int op, nod;
fi >> op >> s;
while(!fi.eof()){
if(op == 0){
nod = get_nod();
nr[nod]++;
}
else if(op == 1){
nod = get_nod();
nr[nod]--;
if(nr[nod] == 0)
sterge(nod);
}
else if(op == 2)
fo << query().first << '\n';
else
fo << query().second << '\n';
fi >> op >> s;
}
fi.close();
fo.close();
return 0;
}