Pagini recente » Cod sursa (job #387417) | Cod sursa (job #2307230) | Cod sursa (job #1912415) | Cod sursa (job #2756088) | Cod sursa (job #63114)
Cod sursa(job #63114)
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
struct nod
{
char *inf;
char *coresp;
nod *link;
};
int transform(char *&inf, char *&coresp)
{
int n=strlen(inf);
coresp=(char *) malloc(sizeof(char)*(n+1));
for(int i=0; i<n; i++)
{
if(inf[i]>='a' && inf[i]<='c') { coresp[i]='2'; continue; }
if(inf[i]>='d' && inf[i]<='f') { coresp[i]='3'; continue; }
if(inf[i]>='g' && inf[i]<='h') { coresp[i]='4'; continue; }
if(inf[i]>='k' && inf[i]<='l') { coresp[i]='5'; continue; }
if(inf[i]>='m' && inf[i]<='n') { coresp[i]='6'; continue; }
if(inf[i]>='p' && inf[i]<='s') { coresp[i]='7'; continue; }
if(inf[i]>='t' && inf[i]<='v') { coresp[i]='8'; continue; }
if(inf[i]>='w' && inf[i]<='y') { coresp[i]='9'; continue; }
if(inf[i]>='i' && inf[i]<='j') { coresp[i]='1'; continue; }
coresp[i]='0';
}
coresp[n]=0;
return 1;
}
int nod_add(nod *&a, char *&p)
{
nod *nou=(nod *) malloc(sizeof(nod));
int n=strlen(p);
nou->inf=(char *) malloc(sizeof(char)*(n+1));
strcpy(nou->inf,p);
transform(p,nou->coresp);
nou->link=a;
a=nou;
return 1;
}
int nod_del(nod *&a)
{
nod *q;
while(a)
{
q=a;
a=a->link;
delete(q);
}
return 1;
}
char * nod_search(nod *a, char *&p)
{
//cout<<"Incercari: ";
while(a)
{
//cout<<a->coresp<<" ";
if(strcmp(p,a->coresp)==0) { return a->inf; }
a=a->link;
}
//cout<<endl;
return NULL;
}
int afisare(nod ***w)
{
for(int i=0; i<50; i++)
for(int j=0; j<10; j++)
{
nod *q=w[i][j];
//cout<<i<<" "<<j<<": ";
while(q)
{
//cout<<q->inf<<" ";
q=q->link;
}
//cout<<endl;
}
return 1;
}
char * functie(nod ***&w, char *&p)
{
//cout<<"P-ul este: "<<p<<endl;
int n=strlen(p);
if(!n) return p;
for(int i=n-1; i>=0; i--)
{
char *q=(char *) malloc(sizeof(char)*(i+2));
char *q1=(char *) malloc(sizeof(char)*(i+2));
strncpy(q,p,i+1);
q[i+1]=0;
//cout<<"Prefixul extras este: "<<q<<endl;
//cout<<"Verificare in "<<i<<" "<<int(p[0])-48<<" "<<endl;
q1=nod_search(w[i][int(p[0])-48],q);
if(q1)
{
strcpy(q,q1);
strncpy(q1,&p[i+1],n-1-i);
q1[n-1-i]=0;
//cout<<"Noul sir, sufixul primului este "<<q1<<";"<<endl;
if(strlen(q1)>0)
{
char * k=functie(w,q1);
if(k)
{
char *d=(char *) malloc(sizeof(char)*(strlen(k)+2+strlen(q)));
d=strcat(q," ");
d=strcat(d,k);
return d;
}
}
else return q;
}
free(q);
}
return NULL;
}
int citire(istream &in, ostream &out, nod ***&w)
{
for(int i=0; i<50; i++)
{
for(int j=0; j<10; j++)
{
//nod_del(w[i][j]);
w[i][j]=NULL;
}
}
char *a=(char *) malloc(sizeof(char)*50);
char *b=(char *) malloc(sizeof(char)*50);
int n;
in.get(a,50);
if(strcmp(a,"-1")==0) return 0;
in.get();
in>>n;
for(i=0; i<n; i++)
{
in.get();
in.get(b,50);
int m=strlen(b);
char *q;
transform(b,q);
//cout<<m-1<<" "<<int(q[0])-48<<" "<<b<<endl;
nod_add(w[m-1][int(q[0])-48],b);
}
in.get();
//afisare(w);
char *p=functie(w,a);
if(p) out<<p<<endl;
else out<<"No solution."<<endl;
return 1;
}
int init(nod ***&w)
{
for(int i=0; i<50; i++)
{
w[i]=(nod **) malloc(sizeof(nod *)*10);
for(int j=0; j<10; j++)
w[i][j]=NULL;
}
return 1;
}
int main()
{
nod ***w;
w=(nod ***) malloc(sizeof(nod **)*50);
init(w);
//ifstream f("input");
//ofstream g("output");
int k=0;
do
{
k=citire(cin,cout,w);
}
while(k==1);
//f.close();
//g.close();
return 1;
}