#include #include #include #include #include #include #include #include using namespace std; int max(int a, int b, int c){ if(a>b){ if(a>c) return a; else return c; }else{ if(b>c) return b; else return c; } } char *lcs(const char *a, const char *b, const char *c){ int lena= strlen(a)+1; int lenb= strlen(b)+1; int lenc= strlen(c)+1; int bufrlen = 40; char bufr[40], *result; int i,j,k; const char *x, *y, *z; int ***lengths = (int***)calloc(lena,sizeof(int***)); for(i=0; i< lena; i++){ lengths[i]=(int**)calloc(lenb, sizeof(int*)); for(j=0; j< lenb; j++){ lengths[i][j]=(int*)calloc(lenc, sizeof(int)); } } lengths = (int***)calloc(lena,sizeof(int**)); lengths[0] = (int**)calloc((size_t)lena*lenb,sizeof(int*)); lengths[0][0] = (int*)calloc((size_t)lena*lenb*lenc,sizeof(int)); for(i=1; i < lena; i++){ lengths[i]=lengths[i-1]+lenb; } for(i=1; i < lena*lenb; i++){ lengths[0][i]=lengths[0][i-1]+lenc; } for(i=0,x=a; *x; i++, x++){ for(j=0,y=b; *y; j++, y++){ for(k=0,z=c; *z; k++, z++){ if(*x==*y){ lengths[i+1][j+1][k+1]=lengths[i][j][k]+1; }else{ int ml=max(lengths[i+1][j+1][k], lengths[i+1][j][k+1],lengths[i][j+1][k+1]); lengths[i+1][j+1][k+1]=ml; } } } } result = bufr+bufrlen; *--result='\0'; i=lena-1; j=lenb-1; k=lenc-1; while((i>0)&&(j>0)&&(k>0)){ if(lengths[i][j][k]==lengths[i-1][j][k]) i -=1; else if(lengths[i][j][k]==lengths[i][j-1][k]) j -=1; else if(lengths[i][j][k]==lengths[i][j][k-1]) k -=1; else{ *--result=a[i-1]; i-=1;j-=1;k-=1; } } free(lengths[0][0]); free(lengths[0]); free(lengths); return strdup(result); } int main(int argc, char** argv){ ifstream fin(argv[1]); assert(fin); ofstream fout("output.txt"); string s1,s2,s3; int m,n,o; char res[10000]; fin >> m >> n >> o; fin >> s1 >> s2 >> s3; sprintf(res, "%s", lcs(s1.c_str(),s2.c_str(),s3.c_str())); fout << strlen(res); fout.close(); fin.close(); //printf("%s", lcs(argv[1],argv[2], argv[3])); }