Pagini recente » Cod sursa (job #1749467) | Cod sursa (job #1908871) | Cod sursa (job #952044) | Cod sursa (job #2095290) | Cod sursa (job #2266521)
#include <bits/stdc++.h>
using namespace std;
string s;
map <int,map <int,int>> ad;
map <int,int> nr, tat;
int ct = 1;
int get_nod(){
int nod = 0;
for(auto ch : s){
if(ad[nod][ch] == 0){
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);
}
//eliminam si pe nodp din lista lui nod
if(nod != nodp)
for(int i = 'a'; i <= 'z'; i++)
if(ad[nod][i] == nodp)
ad[nod].erase(i);
}
pair<int,int> query(){
int nod = 0;
for(int i = 0; i < s.size(); i++){
if(ad[nod][s[i]] == 0)
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;
}