Pagini recente » Cod sursa (job #3120810) | Cod sursa (job #85022) | Cod sursa (job #475177) | Cod sursa (job #90103) | Cod sursa (job #1989609)
#include <fstream>
#include<cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
char s[100100]; int frecv[100100]; int k,nodes,maxim=-1,tata[100100],grad[100100];
struct bla
{
int nod; char c; int urm,start,nr;
} t[100100];
void adauga (int poz,int rad)
{
for(int x=t[rad].start;x!=0;x=t[x].urm)
{
if(t[x].c==s[poz] && t[x].nod!=-1)
{
if(poz==strlen(s)-1) t[x].nr++,frecv[t[x].nod]++;
else adauga(poz+1,t[x].nod);
return;
}
}
nodes++; grad[rad]++;
t[nodes].nod=nodes; t[nodes].urm=t[rad].start; t[rad].start=nodes; t[nodes].c=s[poz]; tata[nodes]=rad;
if(poz==strlen(s)-1) t[nodes].nr++;
else adauga(poz+1,nodes);
}
void verif (int varf)
{
if(frecv[varf]!=0) return;
if(grad[varf]>1) return;
if(varf==0) return;
int rad=tata[varf];
for(int x=t[rad].start;x!=0;x=t[x].urm)
{
if(t[x].nod==varf) {t[x].nod=-1;grad[tata[varf]]--; break;}
}
verif(tata[varf]);
}
void sterge (int poz,int rad)
{
for(int x=t[rad].start;x!=0;x=t[x].urm)
{
if(t[x].c==s[poz])
{
if(poz==strlen(s)-1) {t[x].nr--; frecv[t[x].nod]--; verif(t[x].nod);}
else sterge(poz+1,t[x].nod);
return;
}
}
}
void answare (int poz,int rad)
{
for(int x=t[rad].start;x!=0;x=t[x].urm)
{
if(t[x].c==s[poz] && t[x].nod!=-1)
{
if(poz==strlen(s)-1) cout<<t[x].nr<<"\n";
else answare(poz+1,t[x].nod);
return;
}
}
cout<<0<<"\n";
}
void answare_again (int poz,int rad)
{
for(int x=t[rad].start;x!=0;x=t[x].urm)
{
if(t[x].c==s[poz] && t[x].nod!=-1)
{
if(t[x].c==s[poz]) maxim=max(maxim,poz);
if(poz==strlen(s)-1) return;
else
answare_again(poz+1,t[x].nod);
}
}
}
void read ()
{ int p;
while(cin>>p)
{
cin>>s;
if(p==0) adauga(0,0);
else if(p==1) sterge(0,0);
else if(p==2) answare(0,0);
else if(p==3) {answare_again(0,0); cout<<maxim+1<<"\n"; maxim=-1; }
}
}
int main()
{
read();
cin.close();
cout.close();
return 0;
}