Pagini recente » Cod sursa (job #1685918) | Monitorul de evaluare | Cod sursa (job #2562746) | Cod sursa (job #426537) | Cod sursa (job #577830)
Cod sursa(job #577830)
#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],nrcuv[NM];
vector<char>l[NM];
char s[MM];
int rez, pas, lung,nrd,p,dep[NM];
inline void add(int p,int nod)
{
int g=a[nod].size();
bool ok=0;
for (int i=0; i<g; ++i)
{
if (l[nod][i]!=s[p])
continue;
ok=1;
dep[a[nod][i]]=1+dep[nod];
if (p==lung)
{
if (l[nod][i]=='e')
printf("");
++nrcuv[nod][i];
return;
}
add(p+1,a[nod][i]);
}
if (!ok)
{
++nrd;
a[nod].pb(nrd);
l[nod].pb(s[p]);
dep[nrd]=1+dep[nod];
nrcuv[nod].pb(0);
if (p<lung)
add(p+1,nrd);
if (p==lung)
{
if (l[nod][0]=='e')
printf("");
++nrcuv[nod][a[nod].size()-1];
printf("");
}
}
}
inline void sterge(int p, int nod)
{
int g=a[nod].size();
bool ok=0;
for (int i=0; i<g; ++i)
{
if (l[nod][i]!=s[p])
continue;
sterge(p+1,a[nod][i]);
if (p==lung)
{
if (a[a[nod][i]].size()==0)
{
l[a[nod][i]].erase(l[a[nod][i]].begin(),l[a[nod][i]].end());
nrcuv[a[nod][i]].erase(nrcuv[a[nod][i]].begin(),nrcuv[a[nod][i]].end());
a[a[nod][i]].erase(a[a[nod][i]].begin(),a[a[nod][i]].end());
l[nod].erase(l[nod].begin()+i);
nrcuv[nod].erase(nrcuv[nod].begin()+i);
a[nod].erase(a[nod].begin()+i);
--lung;
return;
}
if (nrcuv[nod][i])
--nrcuv[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[nod][i]!=s[p])
continue;
if (p==lung)//am cuvant
{
rez=nrcuv[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[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;
}