题目链接:http://poj.org/problem?id=3080
题目描述:
给定多个(2~10)长为60的串,然后求最长公共字串,这里使用的是用DP直接两个两个求,为9 * 60 * 60复杂度,特别注意一点的就是如果是多个长度相同的最长公共字串,输出字典序最小的一个串。
关于最长公共字串可以参照:http://www.ahathinking.com/archives/122.html
<span style="font-size:18px;">#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std ;
///注意字典序。。
const int MAXN = 100 ;
int dp[MAXN][MAXN] ;
char a[MAXN], b[MAXN] ;
int len1, len2 ;
bool _find ;
//DP计算LCS, 连续
void calDPLCS(){
memset(dp, 0, sizeof(dp)) ;
int len = 0, pos = 0 ;
for( int i = 0; i < len1; i++ ){
for( int j = 0; j < len2; j++ ){
if( a[i] == b[j] ){
if( i == 0 || j == 0 ){
dp[i][j] = 1 ;
}else{
dp[i][j] = dp[i-1][j-1] + 1 ;
}
if( dp[i][j] > len ){
len = dp[i][j] ;
pos = i - len + 1 ;
}else if( dp[i][j] == len ){ //注意字典序。。。
if( a[i-len+1] < a[pos] ) pos = i - len + 1 ;
}
}
}
}
//cout << len << endl ;
if( len < 3 ){
cout << "no significant commonalities" << endl ;
_find = true ;
}else{
char tmp[MAXN] ;
for( int i = 0; i < len; i++ ) tmp[i] = a[i+pos] ;
for( int i = 0; i < len; i++ ) a[i] = tmp[i] ;
a[len] = '\0' ;
}
}
//
int main(){
freopen("1234.txt", "r", stdin) ;
int t ;
scanf("%d", &t) ;
while( t-- ){
_find = false ;
int m ;
scanf("%d", &m) ;
scanf("%s", a) ;
for( int i = 1; i < m; i++ ){
cin >> b ;
len1 = strlen(a) ;
len2 = strlen(b) ;
//cout << len1 << " " << len2 << endl ;
if( !_find ) calDPLCS() ;
}
if( !_find ) cout << a << endl ;
}
}</span>