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);
}
示例#2
0
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);
}
示例#3
0
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 */