Pagini recente » Cod sursa (job #1820086) | Cod sursa (job #3134015) | Cod sursa (job #269653) | Cod sursa (job #413223) | Cod sursa (job #2181559)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod {
int nrfii,ind,nr,term;
nod *fii[26];
nod() {
term=0;
nr=0;
ind=0;
nrfii=0;
memset(fii,0,sizeof(fii));
}
}*T;
void adaug(char *s,nod *&p) { ///adauga o aparitie a cuvantului s in lista
if (p->fii[*s-'a']==0) {
p->fii[*s-'a']=new nod;
p->fii[*s-'a']->ind=p->ind+1;
p->nr++;
}
p->fii[*s-'a']->nrfii++;
if (*(s+1)) adaug(s+1,p->fii[*s-'a']);
else p->fii[*s-'a']->term++;
//cout<<*s<<' '<<p->fii[*s-'a']->nrfii<<' '<<p->fii[*s-'a']->ind<<" ";
}
void q3(char *s,nod *p,int &r) { ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
//cout<<s<<' ';
if (p->fii[*s-'a']!=0) {
r=max(r,p->fii[*s-'a']->ind);
if (*(s+1)) q3(s+1,p->fii[*s-'a'],r);
}
}
void q1(char *s,nod *p) { ///sterge o aparitie a cuvantului w din lista
if (*(s+1)) q1(s+1,p->fii[*s-'a']);
else p->fii[*s-'a']->term--;
p->fii[*s-'a']->nrfii--;
if (p->fii[*s-'a']->nrfii==0) {
p->fii[*s-'a']=0;
p->nr--;
}
}
void q2(char *s,nod *p,int &r) { ///tipareste numarul de aparitii ale cuvantului s in lista
if (p->fii[*s-'a']!=0) {
if (*(s+1)) q2(s+1,p->fii[*s-'a'],r);
else if (p->fii[*s-'a']->term) r=p->fii[*s-'a']->term;
}
}
int main() {
char s[26];
int x,y;
T=new nod;
while (f>>x>>s) {
if (x==0) adaug(s,T);
else if (x==1) {
q1(s,T);
}
else if (x==2) {
y=0;
q2(s,T,y);
g<<y<<'\n';
}
else if (x==3) {
y=0;
q3(s,T,y);
g<<y<<'\n';
}
*s=NULL;
//cout<<'\n';
}
return 0;
}