Pagini recente » Cod sursa (job #904242) | Cod sursa (job #368423) | Cod sursa (job #2152924) | Cod sursa (job #1759863) | Cod sursa (job #884162)
Cod sursa(job #884162)
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
struct nod{
int nr;
char s[30];
nod *next;
}*First;
void Insert(nod *p,char s[30]){
if(!p->next||strcmp(s,p->next->s)<0){
nod *q=new nod;
q->nr=1;
strcpy(q->s,s);
q->next=p->next;
p->next=q;
}
else{
if(strcmp(s,p->next->s)==0){
p->nr++;
}
else
Insert(p->next,s);
}
}
int Read(char s[30]){
int nr;
scanf("%d %s\n",&nr,s);
return nr;
}
void FirstFunction(){
freopen("trie.in","r",stdin);
First=new nod;
First->nr=0;
First->s[0]='\0';
First->next=0;
}
void write(nod *p){
if(p){
printf("%d %s\n",p->nr,p->s);
write(p->next);
}
}
int Min(int a,int b){
if(a<b)
return a;
return b;
}
int MaxPrefix(char prefix[30],char source[30]){
int i,min=Min(strlen(prefix),strlen(source));
for(i=0;i<min;i++){
if(prefix[i]!=source[i])
return i;
}
return i;
}
int Delete(nod *p,char s[120]){
if(p->next==0||strcmp(s,p->next->s)<0)
return 0;
if(strcmp(p->next->s,s)==0){
nod *q=p->next;
if(q->nr>1)
q->nr--;
else{
p->next=q->next;
delete q;
}
return 1;
}
return Delete(p->next,s);
}
int NumberOfAppearances(nod *p,char s[120]){
if(p->next==0||strcmp(s,p->next->s)<0)
return 0;
if(strcmp(p->next->s,s)==0){
return p->next->nr;
}
return NumberOfAppearances(p->next,s);
}
int Max(int a,int b){
if(a>b)
return a;
return b;
}
int MaximalPrefix(nod *p,char s[30]){
if(p->next==0)
return 0;
int nr1=MaxPrefix(p->next->s,s);
int n=strlen(s);
if(nr1==n)
return nr1;
int nr2=MaximalPrefix(p->next,s);
if(nr2==n)
return nr2;
return Max(nr1,nr2);
}
int main()
{
int nr;
char s[30];
FirstFunction();
freopen("trie.out","w",stdout);
while(!feof(stdin)){
nr=Read(s);
if(nr==0)
Insert(First,s);
else if(nr==1){
Delete(First,s);
}
else if(nr==2){
printf("%d\n",NumberOfAppearances(First,s));
}
else if(nr==3){
printf("%d\n",MaximalPrefix(First,s));
}
}
//write(First->next);
fclose(stdin);
fclose(stdout);
return 0;
}