Pagini recente » Cod sursa (job #226892) | Cod sursa (job #406971) | Cod sursa (job #1203984) | Monitorul de evaluare | Cod sursa (job #577838)
Cod sursa(job #577838)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define pb push_back
#define NM 2000001
#define MM 100001
vector<int> a[NM];
char s[MM];
int rez, pas, lung,nrd,p,dep[NM],l[MM],nrcuv[MM];
inline void add(int p,int nod)
{
int g=a[nod].size();
bool ok=0;
for (int i=0; i<g; ++i)
{
if (l[a[nod][i]]!=s[p])
continue;
ok=1;
dep[a[nod][i]]=1+dep[nod];
if (p==lung)
{
++nrcuv[a[nod][i]];
return;
}
add(p+1,a[nod][i]);
}
if (!ok)
{
++nrd;
a[nod].pb(nrd);
l[nrd]=s[p];
dep[nrd]=1+dep[nod];
nrcuv[nrd]=0;
if (p<lung)
add(p+1,nrd);
if (p==lung)
++nrcuv[a[nod].size()-1];
}
}
inline void sterge(int p, int nod)
{
int g=a[nod].size();
bool ok=0;
for (int i=0; i<g; ++i)
{
if (l[a[nod][i]]!=s[p])
continue;
sterge(p+1,a[nod][i]);
if (p==lung)
{
if (a[a[nod][i]].size()==0)
{
a[a[nod][i]].erase(a[a[nod][i]].begin(),a[a[nod][i]].end());
a[nod].erase(a[nod].begin()+i);
--lung;
return;
}
if (nrcuv[a[nod][i]])
--nrcuv[a[nod][i]];
--lung;
return;
}
}
}
inline void tipar(int p, int nod)
{
int g=a[nod].size();
for (int i=0; i<g; ++i)
{
if (rez)
return;
if (l[a[nod][i]]!=s[p])
continue;
if (p==lung)//am cuvant
{
rez=nrcuv[a[nod][i]]+1;
return;
}
tipar(p+1,a[nod][i]);
}
}
inline void prefix(int p, int nod)
{
int g=a[nod].size();
bool ok=0;
for (int i=0; i<g; ++i)
{
if (rez)
return;
if (l[a[nod][i]]!=s[p])
continue;
ok=1;
prefix(p+1,a[nod][i]);
if (rez)
return;
rez=dep[a[nod][i]]+1;
}
if (!ok)
return;
}
inline void citire()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
//fgets(s,MM, stdin);
while (!feof(stdin))
{
p=2;
fgets(s,MM,stdin);
lung=strlen(s)-2;
if (s[0]=='0')
{
add(p,0);
continue;
}
if (s[0]=='1')
{
sterge(p,0);
continue;
}
if (s[0]=='2')
{
rez=0;
tipar(p,0);
printf("%d\n",rez-1);
continue;
}
if (s[0]=='3')
{
rez=0;
pas=0;
prefix(p,0);
printf("%d\n",rez-1);
continue;
}
}
}
int main()
{
citire();
return 0;
}