Pagini recente » Cod sursa (job #1365293) | Cod sursa (job #3320145) | Cod sursa (job #1809406) | Monitorul de evaluare | Cod sursa (job #3307477)
#include <bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std;
const int N=2e5+5;
struct Node
{
Node *g[26];
int cnt=0,ends=0;
Node() {for(int i=0;i<26;++i) g[i]=NULL;}
};
Node *root=new Node;
void add(Node *&node, string s, int dep=-1)
{
if(dep==s.size()-1) {node->ends++;return;}
if(node->g[s[dep+1]-'a']==NULL) node->g[s[dep+1]-'a']=new Node;
node->g[s[dep+1]-'a']->cnt++;
add(node->g[s[dep+1]-'a'],s,dep+1);
}
void del(Node *&node, string s, int dep=-1)
{
if(dep==s.size()-1) {node->ends--;return;}
node->g[s[dep+1]-'a']->cnt--;
del(node->g[s[dep+1]-'a'],s,dep+1);
}
int query(Node *node, string s, int dep=-1)
{
if(node==NULL) return 0;
if(dep!=-1&&node->cnt==0) return 0;
if(dep==s.size()-1) return node->ends;
return query(node->g[s[dep+1]-'a'],s,dep+1);
}
int pref(Node *node, string s, int dep=-1)
{
if(node==NULL) return 0;
if(dep!=-1&&node->cnt==0) return 0;
if(dep==s.size()-1) return 1;
return 1+pref(node->g[s[dep+1]-'a'],s,dep+1);
}
signed main()
{
ifstream cin("trie.in");ofstream cout("trie.out");
int op;string s;
while(cin>>op)
{
cin>>s;
if(op==0) add(root,s);
else if(op==1) del(root,s);
else if(op==2) cout<<query(root,s)<<'\n';
else cout<<pref(root,s)-1<<'\n';
}
}