int main(){ int i,l,l1,l2,temp=0,ans=0; Trie T; char *s,*t,*f; scanf("%s\n",t1); scanf("%s\n",t2); T=initTrie(); l1 = strlen(t1); l2 = strlen(t2); if(l1>l2){ t=t2; l=l2; f=t1; } else{ t=t1; l=l1; f=t2; } for(i=l;i>=0;i--) addString(T,t+i); while(*f!='\0'){ temp = getLCS(T,f++); if (ans < temp) ans = temp; } printf("%d\n",ans); destroyTrie(T); }
void Trace::LCSMergeTrace(Trace *slave){ int mlen = traceLen(); int slen = slave->traceLen(); int width = slen + 1; int *b, *c; b = (int *) calloc( (mlen+1) * (slen+1), sizeof(int) ); if(!b){ fprintf(stderr, "calloc(%ld) b failed\n", (mlen+1) * (slen+1) * sizeof(int)); exit(1); } c = (int *) calloc( (mlen+1) * (slen+1), sizeof(int) ); if(!c){ fprintf(stderr, "calloc(%ld) c failed\n", (mlen+1) * (slen+1) * sizeof(int)); exit(1); } Event *miter, *siter; int i, j; for(i=0, miter = head; miter != NULL; i++, miter = miter->next ){ for(j=0, siter = slave->getHead(); siter != NULL; j++, siter = siter->next ){ if(miter->sigEquals(siter)){ c[(i+1)*width + (j+1)] = c[i*width + j] + 1; b[(i+1)*width + (j+1)] = DIRECTION_UL; } else if(c[i*width + (j+1)] >= c[(i+1)*width + j]) { c[(i+1)*width + (j+1)] = c[i*width + (j+1)] ; b[(i+1)*width + (j+1)] = DIRECTION_UP; } else { c[(i+1)*width + (j+1)] = c[(i+1)*width + j] ; b[(i+1)*width + (j+1)] = DIRECTION_LEFT; } } } vector<matching_pair_t *> *pairs = getLCS(b, mlen, slen); LCSDoMerge(pairs, slave); for(unsigned i=0; i<pairs->size(); i++) delete pairs->at(i); delete pairs; free(b); free(c); }
vector<matching_pair_t *>* Trace::matchLoopLCS(Event* merge_head, Event* merge_tail, int merge_length, Event *target_head, Event* target_tail, int target_length){ assert(merge_length > 0 && target_length > 0); /* calculate the longest common subsequence */ vector<matching_pair_t *> *pairs; /* merge_head and target_head should always be in the LCS */ if(merge_length == 1 && target_length == 1){ pairs = new vector<matching_pair_t *>(); matching_pair_t *pair = new matching_pair_t; pair->index1 = 0; pair->index2 = 0; pairs->push_back(pair); return pairs; } else if( (merge_length == 1 && target_length == 2) || (merge_length == 2 && target_length == 1)){ /* should never reach here! */ assert(0); } else { merge_head = merge_head->next; merge_length--; target_head = target_head->next; target_length--; } int width = target_length + 1; int *b, *c; b = (int *) calloc( (merge_length+1) * (target_length+1), sizeof(int) ); if(!b){ cerr << "calloc(" << (merge_length+1) * (target_length+1) * sizeof(int) << ") b failed" << endl; exit(1); } c = (int *) calloc( (merge_length+1) * (target_length+1), sizeof(int) ); if(!c){ cerr << "calloc(" << (merge_length+1) * (target_length+1) * sizeof(int) << ") c failed" << endl; exit(1); } Event *miter, *titer; int i, j; for(i=0, miter = merge_head; miter != merge_tail->next && miter != NULL; i++, miter = miter->next ){ for(j=0, titer = target_head; titer != target_tail->next && titer != NULL; j++, titer = titer->next ){ if(miter->sigMatch(titer) && miter->opMatch(titer) ){ c[(i+1)*width + (j+1)] = c[i*width + j] + 1; b[(i+1)*width + (j+1)] = DIRECTION_UL; } else if(c[i*width + (j+1)] >= c[(i+1)*width + j]) { c[(i+1)*width + (j+1)] = c[i*width + (j+1)] ; b[(i+1)*width + (j+1)] = DIRECTION_UP; } else { c[(i+1)*width + (j+1)] = c[(i+1)*width + j] ; b[(i+1)*width + (j+1)] = DIRECTION_LEFT; } } } pairs = getLCS(b, merge_length, target_length); for(unsigned i=0; i<pairs->size(); i++){ pairs->at(i)->index1++; pairs->at(i)->index2++; } matching_pair_t *pair = new matching_pair_t; pair->index1 = 0; pair->index2 = 0; pairs->insert(pairs->begin(), pair); free(b); free(c); return pairs; } /* matchLoopLCS */