poj 3080 Blue Jeans,poj3080bluejeans
連結:poj 3080
題意:輸入N個DNA序列,每個DNA序列長度都為60。找到這些串的最長共有子序列。
註:若找不到,或最長子序列長度小於2,則輸出no significant commonalities,否則輸出最長公用子串,若長度相同輸出字典序最小的
思路:暴力枚舉第一個DNA序列的每一個子序列,用strstr()函數與其餘的序列進行匹配
strstr(s,t)是在s串中找t串,若找到,返回t串第一次在s中出現的首字元的地址,如果沒有找到,返回NULL
#include<stdio.h>#include<string.h>char t[65],ans[65];void cmp(){ if(strlen(ans)<strlen(t)) strcpy(ans,t); else if(strlen(ans)==strlen(t)) if(strcmp(ans,t)>0) strcpy(ans,t);}int main(){ int n,m,i,j,k,a; char s[12][65]; scanf("%d",&n); while(n--){ scanf("%d",&m); for(i=0;i<m;i++) scanf("%s",s[i]); ans[0]=0; for(i=0;i<60;i++){ //子串的起始位置為i k=0; for(j=i;j<60;j++){ t[k++]=s[0][j]; //每次在前一個子串後加上一個字元 t[k]=0; //記得在子串末尾加上Null 字元 for(a=1;a<m;a++) //判斷其餘字串是否包含該子串 if(strstr(s[a],t)==NULL) break; if(a==m) cmp(); } } if(strlen(ans)>=3) printf("%s\n",ans); else printf("no significant commonalities\n"); } return 0;}
POJ3080上的測試資料是對的,但是提交時就是WA,為何?哪個大牛哥給我看看
#include <iostream>
#include <string>
using namespace std;
string a[11];
int n;
void bijiao()
{
int t=1,slen=0,result[11],qsz;
string ans="";
for(int len=60;len>=3;len--)
{
for( qsz=0;qsz<=60-len;qsz++)
{
t=1;
a[10]=a[0].substr(qsz,len);
for(int i=1;i<n;i++)
{
for(int qs=0;qs<=60-len;qs++)
{
result[i]=a[i].compare(qs,len,a[10]);
if(result[i]==0)
{
t++; break;
}
//if(qs==60-len)
//goto loop;
}
if(t==n)
{
slen=len;
break;
}
}
if(t==n)
{
slen=len;
if(ans==""||ans>a[10]) ans = a[10];
continue;
}
}
if(slen)
{
break;
}
}
if(slen>=3)
cout<<ans<<endl;
else
cout<<"no significant commonalities"<<endl;
}
int main()
{
int num;
cin>>num;
while(num--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
bijiao();
}
return 0;
}
POJ 3080 題目
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct STR{
char data[62];
int length;
};
STR str[11];
int searchMaxSubString(int n)
{
char subString[62],minLengthString[62];
int ok = 0;
char tempsubString[62]; // 需要一個臨時字串
int sublength,i,j;
strcpy(minLengthString,str[0].data);
sublength=60;
while(sublength>=3) // 長度為3的也算
{
for(i=0;i+sublength<61;i++)
{
strncpy(subString,minLengthString+i,sublength);
subString[sublength]='\0';
for(j=1;j<n;j++)
{
if(strstr(str[j].data,subString)==NULL)
break;
}
if(j==n)
{
//printf("%s\n",subString);
if(!ok || strcmp(subString,tempsubString)<0) // 如果之前沒有搜到或者搜到的比之前小
strcpy(tempsubString,subString); // 記錄新的字串
ok = 1; // 已經搜到的標記
}
}
if(ok) // 如果搜到了
{
printf("%s\n",tempsubString); // 輸出
return 0;
}
sublength--;
}
printf("no significant commonalities\n");
return 0;
}
int main()
{
int times,i,n;
scanf("%d",×);
while(times--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&str[i].data);
}
searchMaxSubString(n);
}
return 0;
}...餘下全文>>