Pagini recente » Cod sursa (job #34871) | Cod sursa (job #3200890) | Cod sursa (job #423269) | Cod sursa (job #1237583) | Cod sursa (job #2410570)
#include <bits/stdc++.h>
#define LMAX 21
using namespace std;
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
struct Tnod {
int nrAp,index,nrCuv;
char c;
Tnod(char c,int index) : c(c),index(index) {
nrAp=1;
nrCuv=0;
}
};
vector<vector<Tnod> >t;
int op,n,i,nod,sz,j,ok,indexT,nrApT,l;
char s[LMAX];
int main() {
t.push_back(vector<Tnod>());
while (!feof(f)) {
fscanf(f,"%d%s ",&op,s);
j=nod=0;
n=strlen(s);
switch (op) {
case 0: ///adaugare
while (j<n) {
ok=0;
sz=t[nod].size();
for (i=0;i<sz;i++)
if (t[nod][i].c==s[j]) {
ok=1;
break;
}
if (ok) {
t[nod][i].nrAp++;
if (j==n-1) t[nod][i].nrCuv++;
nod=t[nod][i].index;
}
else {
t.push_back(vector<Tnod>());
t[nod].push_back(Tnod(s[j],++indexT));
if (j==n-1) t[nod][sz].nrCuv++;
nod=indexT;
}
j++;
}
break;
case 1: ///stergere o aparitie
case 2: ///afisare numar aparitii
case 3: ///lungimea celui mai lung prefix comun
l=0;
while (j<n) {
ok=0;
sz=t[nod].size();
for (i=0;i<sz;i++)
if (t[nod][i].c==s[j]) {
ok=1;
break;
}
if (ok) {
if (t[nod][i].nrAp) l++;
if (op==1) t[nod][i].nrAp--; ///stergere
if (j==n-1)
if (op==1) t[nod][i].nrCuv--;
else if (op==2) fprintf(g,"%d\n",t[nod][i].nrCuv);
else if (op==3) fprintf(g,"%d\n",l);
nod=t[nod][i].index;
j++;
}
else {
if (op==2) fprintf(g,"0\n");
else if (op==3) fprintf(g,"%d\n",l);
break;
}
}
break;
}
}
return 0;
}