トピック:
サンプル入力:
3
2
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
3
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
出力例:
no significant commonalities
AGATAC
CATCATCAT
おそらく、質問の意味:
文字が大きい場合、それはまたは共通出力に等しい未満、3メートル列出力よりも有意な共通性である場合に、N個の入力グループは、文字列のMのそれぞれ、最大弦パブリック文字列M、最大の共通部分を見つけます。文字列がある場合は、文字列、等しい複数最小限行ってきました。 |
ブルートフォースのアイデアやアルゴリズム:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,m;
char str[11][61],x[61],y[61];
int res_len,str_len,temp,i,j,k,t;
cin>>n;
while(n--) {
res_len=0;
cin>>m;
for(int i=0; i<m; i++) cin>>str[i];
str_len=strlen(str[0]);
for( i=1; i<=str_len; i++) {
for( j=0; j+i-1<str_len; j++) {
for( k=0; k<i; k++) {
x[k]=str[0][j+k];
}
x[k]='\0';
for( k=0; k<m; k++) {
if(strstr(str[k],x)==NULL) break;
}
if(k>=m) {
temp=strlen(x);
if(temp==res_len) {
for( t=0; t<res_len; t++) {
if(y[t]>x[t]) {
for( t=0; t<=res_len; t++) y[t]=x[t];
break;
}
}
}
if(temp>res_len) {
res_len=temp;
for( t=0; t<=res_len; t++) y[t]=x[t];
}
}
}
}
if(res_len>=3) cout<<y<<endl;
else cout<<"no significant commonalities"<<endl;
}
return 0;
}
特記事項:
iが1である場合、実際には、これは、変数iが、単一の文字がトラバースに60回行われている、ので、私は2以上である場合、文字列の複数から構成されているI-1 CI + Jを行いますライン上。たとえば、ときに4回行われ、文字列ABCDトラバーサルIS A-> B-> C-> D、の文字です。2つの文字がなったときしかし、AB-> BC-> cdが十分にある三回を横断します。