Pagini recente » Cod sursa (job #1836336) | Cod sursa (job #309444) | Cod sursa (job #1735327) | Cod sursa (job #698210) | Cod sursa (job #2205271)
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
int nrf;
int ct;
nod *urm[26];
nod()
{
memset(urm, 0, sizeof(urm));
nrf=0;
ct=0;
}
}*T=new nod();
void add(string s)
{
int i;
nod *t=T;
for(auto a:s)
{
t->nrf++;
i=a-'a';
if(!t->urm[i])
t->urm[i]=new nod();
t=t->urm[i];
}
t->ct++;
}
int pref(string s)
{
int i, p=0;
nod *t=T;
for(auto a:s)
{
i=a-'a';
if(!t->urm[i]||!(t->urm[i]->ct||t->urm[i]->nrf))
break;
t=t->urm[i];
p++;
}
return p;
}
void cut(string s)
{
int i;
nod *t=T;
for(auto a:s)
{
t->nrf--;
if(t->nrf==0)
{
t=0;
return;
}
i=a-'a';
if(!t->urm[i])
break;
t=t->urm[i];
}
t->ct--;
}
int nrap(string s)
{
int i;
nod *t=T;
for(auto a:s)
{
i=a-'a';
if(!t->urm[i])
return 0;
t=t->urm[i];
}
return t->ct;
}
int main()
{
int op;
string s;
while(f>>op>>s)switch(op)
{
case 0:add(s);break;
case 1:cut(s);break;
case 2:g<<nrap(s)<<'\n';break;
case 3:g<<pref(s)<<'\n';break;
}
f.close();
g.close();
return 0;
}