Localhost8080

知行合一,自强不息

 

最短公共祖先(两个长字符串)

/*==================================================*\
| 最短公共祖先(两个长字符串)
| The shortest common superstring of 2 strings S1 and S2 is
| a string S with|the minimum number of characters which
| contains both S1 and S2 as a sequence of consecutive
| characters. HDU 1841
\*==================================================*/

#include <iostream>
#include 
<string>
using namespace std;
const int N = 1000010
char  a[2][N];  int  fail[N]; 
inline 
int max(int a, int b) return ( a > b ) ? a : b; } 
int kmp(int &i, int &j, char* str, char* pat)

    
int  k; 
    memset(fail, 
-1sizeof(fail)); 
    
for (i = 1; pat[i]; ++i)
    

        
for (k=fail[i-1]; k>=0 && pat[i]!=pat[k+1]; 
            k
=fail[k]); 
            
if (pat[k + 1== pat[i]) fail[i] = k + 1
    }
 
    i 
= j = 0
    
while( str[i] && pat[j] )
    

        
if( pat[j] == str[i] ) 
            
++i, ++j; 
        
else if(j == 0)
            
++i;//第一个字符匹配失败,从 str下个字符开始 
        else 
            j 
= fail[j-1]+1;     
    }
 
    
if( pat[j] )
        
return -1
    
else 
        
return i-j; 
}
 

int main(void)

    
int  T; 
    scanf(
"%d\n"&T); 
    
while( T-- )
    

        
int  i, j, l1=0, l2=0
        gets(a[
0]); gets(a[1]); 
        
int len1 = strlen(a[0]), len2 = strlen(a[1]), val; 
        val 
= kmp(i, j, a[1], a[0]); // a[1]在前 
        if( val != -1 ) 
            l1 
= len1; 
        
else
        

            
//printf("i:%d, j:%d\n", i, j); 
            if( i == len2 && j-1 >= 0 && a[1][len2-1== a[0][j-1] ) 
                l1 
= j; 
        }
 
        val 
= kmp(i, j, a[0], a[1]); // a[0]在前 
        if( val != -1 ) l2 = len2; 
        
else
        

            
//printf("i:%d, j:%d\n", i, j); 
            if( i == len1 && j-1 >= 0 && a[0][len1-1== a[1][j-1] ) 
                l2 
= j; 
        }
 
        
// printf("l1:%d, l2:%d\n", l1, l2); 
        printf("%d\n", len1+len2-max(l1, l2)); 
    }
 
    
return 0
}

posted on 2010-05-05 15:40 superKiki 阅读(478) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


导航

统计

常用链接

留言簿

随笔档案

文章分类

我的好友

一些常去的网站

搜索

最新评论

阅读排行榜

评论排行榜