Pagini recente » Cod sursa (job #757804) | Cod sursa (job #1907005) | Cod sursa (job #665692) | Cod sursa (job #2179035) | Cod sursa (job #3308552)
#include <bits/stdc++.h>
//#pragma GCC target("avx2")
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//using namespace __gnu_pbds;
using namespace std;
//ofstream fout("date.out");
ifstream fin("trie.in");
ofstream fout("trie.out");
//template <class T>
//using Tree =
// tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
int n;
int op;
int tr(char x)
{
return x-'a';
}
struct node
{
char val;
int cnt;
int nrf;
//bool isleaf;
node * next[26];
node * fa;
node()
{
for(int i=0;i<26;i++)
next[i]=NULL;
fa=NULL;
cnt=0;
//isleaf =false;
nrf=0;
}
};
node * root=new node;
void insertst(string s)
{
node * nod=root;
for(int i=0;i<s.size();i++)
{
char c=s[i];
int nr=tr(c);
nod->nrf++;
if(nod->next[nr]==NULL)
nod->next[nr]=new node;
nod->next[nr]->fa=nod;
nod=nod->next[nr];
}
nod->cnt++;
//nod->isleaf=true;
}
void delst(string s)
{
node *nod =root;
for(int i=0;i<s.size();i++)
{
char c=s[i];
int nr=tr(c);
nod->nrf--;
nod=nod->next[nr];
}
nod->cnt--;
int ln=s.size()-1;
if(nod->cnt==0)
{
while(nod->nrf==0&&nod!=root&&nod->cnt==0)
{
node * aux=nod;
nod=nod->fa;
delete aux;
nod->next[tr(s[ln])]=NULL;
}
}
}
void printst(string s)
{
node *nod=root;
for(int i=0;i<s.size();i++)
{
char c=s[i];
int nr=tr(c);
if(nod->next[nr]==NULL)
{
fout<<"0\n";
return;
}
nod=nod->next[nr];
}
fout<<nod->cnt<<'\n';
}
void printpref(string s)
{
node * nod=root;
for(int i=0;i<s.size();i++)
{
char c=s[i];
int nr=tr(c);
if(nod->next[nr]==NULL)
{
fout<<i<<'\n';
return;
}
nod=nod->next[nr];
}
fout<<s.size()<<'\n';
}
void solve()
{
string s;
fin>>s;
if(op==0)
insertst(s);
if(op==1)
delst(s);
if(op==2)
printst(s);
if(op==3)
printpref(s);
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
int t=1;
//fin>>t;
//int op;
while(fin>>op)
solve();
return 0;
}