Pagini recente » Monitorul de evaluare | Cod sursa (job #1786132) | Cod sursa (job #2231593) | Cod sursa (job #2194392) | Cod sursa (job #2300597)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>cnt; /// cnt end in poz
vector<int>plin; /// is plin
vector<vector<int>>kid;
inline void expand()
{
cnt.push_back(0);
plin.push_back(0);
kid.push_back({});
for(int i=0;i<26;i++)
{
kid.back().push_back(-1);
}
}
inline void add(string s)
{
int nod=0;
for(auto &ch:s)
{
int x=ch-'a';
if(kid[nod][x]==-1)
{
expand();
kid[nod][x]=cnt.size()-1;
}
nod=kid[nod][x];
plin[nod]++;
}
cnt[nod]++;
}
inline void del(string s)
{
int nod=0;
for(auto &ch:s)
{
int x=ch-'a';
nod=kid[nod][x];
}
cnt[nod]--;
if(cnt[nod]==0)
{
nod=0;
for(auto &ch:s)
{
int x=ch-'a';
nod=kid[nod][x];
plin[nod]--;
}
}
}
inline int ask(string s)
{
int nod=0;
for(auto &ch:s)
{
int x=ch-'a';
if(kid[nod][x]==-1)
{
return 0;
}
nod=kid[nod][x];
}
return cnt[nod];
}
inline int ppe(string s)
{
int nod=0;
int ans=0;
for(auto &ch:s)
{
int x=ch-'a';
if(kid[nod][x]==-1)
{
return ans;
}
nod=kid[nod][x];
if(plin[nod]==0)
{
return ans;
}
ans++;
}
return ans;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
expand();
int t;
string s;
while(cin>>t)
{
cin>>s;
if(t==0)
{
add(s);
}
if(t==1)
{
del(s);
}
if(t==2)
{
cout<<ask(s)<<"\n";
}
if(t==3)
{
cout<<ppe(s)<<"\n";
}
}
return 0;
}