Pagini recente » Cod sursa (job #3138999) | Cod sursa (job #309678) | Cod sursa (job #433574) | Cod sursa (job #556104) | Cod sursa (job #2635756)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trieNod
{
char val;
int nr=0;
map<char, trieNod*> cop;
trieNod(char val)
{
this->val=val;
}
trieNod(){}
};
int t;
string line;
void add(string &s, trieNod *poz, int i)
{
poz->nr++;
if(s.size()==i)
return;
if(poz->cop.find(s[i]) == poz->cop.end())
poz->cop[s[i]] = new trieNod(s[i]);
add(s, poz->cop[s[i]], i+1);
}
void del(string &s, trieNod *poz, int i)
{
poz->nr--;
if(s.size()==i)
return;
del(s, poz->cop[s[i]], i+1);
}
int cnt(string &s, trieNod *poz, int i)
{
if(s.size()==i)
{
int ans=poz->nr;
for(auto it : poz->cop)
{
ans-=it.second->nr;
}
return ans;
}
if(poz->cop.find(s[i])==poz->cop.end())
return 0;
return cnt(s, poz->cop[s[i]], i+1);
}
int len(string &s, trieNod *poz, int i)
{
if(poz->nr==0)
return -1;
if(s.size()==i)
return 0;
if(poz->cop.find(s[i])==poz->cop.end())
return 0;
return 1+len(s, poz->cop[s[i]], i+1);
}
int main()
{
trieNod *root = new trieNod();
while(fin)
{
getline(fin, line);
if(line.empty())
break;
string s= line.substr(2, line.size());
switch(line[0])
{
case '0':add(s, root, 0); break;
case '1':del(s, root, 0); break;
case '2':fout<<cnt(s, root, 0)<<'\n'; break;
case '3':fout<<len(s, root, 0)<<'\n'; break;
}
}
return 0;
}