poj 3080 Blue Jeans 解题报告
题目链接:http://poj.org/problem?id=3080
该题属于字符串处理中的串模式匹配问题。题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列。(保证在所有的序列中都有出现)
这里采用了Brute Force算法(由于碱基序列的串长仅为60,规模比较小),这是模式匹配的一种最简单的做法。
设: 最长公共字串为ans,其长度为maxlen。
m个碱基序列为p[0]...p[m-1]。由于公共子序列是每个碱基序列的子串,因此不妨枚举p[0]的每一个可能的子串s。以s为模式,分别以p[1]...p[m-1]为目标进行匹配计算:
若s为p[1]...p[m-1]的公共子串(strstr(p[k], s) != NULL, 1 <= k <= m-1),且s串的长度>maxlen,或者s的长度虽等于maxlen,但字典序小于目前最长的公共子串ans(strcmp(ans, s) > 0),则将s调整为最长公共子串(maxlen = s串的长度; strcpy(ans, s))。在枚举了p[0]的所有子串与p[1]...p[m-1]后,最终得出的最长公共子串ans即为问题的解。
#include <iostream>
#include <string.h>
using namespace std;
const int maxn = + ; // 碱基序列数的上限
const int maxs = + ; // 串长上限 int main()
{
char p[maxn][maxs], ans[maxs], s[maxs];
int i, j, k, len, maxlen, m, n;
while (scanf("%d", &n) != EOF)
{
while (n--)
{
memset(ans, , sizeof(ans)); // 最长公共子串
scanf("%d", &m); // 输入碱基序列的数目
for (i = ; i < m; i++) // 输入第i个碱基序列
scanf("%s", p[i]);
len = strlen(p[]);
maxlen = ; // 最长公共子串的长度
for (i = ; i < len; i++) // 枚举p[0]的每个子串,判断其是否为目标子串,子串的起始位置为i,结束位置为j
{
for (j = i+; j < len; j++)
{
strncpy(s, p[]+i, j-i+); // 提取该子串s(即长度为j-i+1,p[0]+i的所有字符复制到s中
s[j-i+] = '\0';
bool ok = true;
for (k = ; ok && k < m; k++)
{
if (strstr(p[k], s) == NULL) // 试探s是否为p[1]...p[m-1]的公共子串
{
ok = false;
break;
}
}
if (ok && (j-i+ > maxlen || maxlen == j-i+ && strcmp(ans, s) > )) // 若s是目前最长的公共子串,或者虽然s同属最长公共子串但字典序小,则s设为最长公共子串
{
maxlen = j-i+;
strcpy(ans, s);
}
}
}
if (maxlen < ) // 若最长的公共子串的长度不足3,则给出错误信息,否则输出最长公共子串
{
printf("no significant commonalities\n");
}
else
printf("%s\n", ans);
}
}
return ;
}
poj 3080 Blue Jeans 解题报告的更多相关文章
- POJ 3080 Blue Jeans (求最长公共字符串)
POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...
- poj 3080 Blue Jeans
点击打开链接 Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10243 Accepted: 434 ...
- POJ 3080 Blue Jeans (字符串处理暴力枚举)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21078 Accepted: ...
- POJ 3080 Blue Jeans(Java暴力)
Blue Jeans [题目链接]Blue Jeans [题目类型]Java暴力 &题意: 就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10 规定: 1. 最长公共 ...
- POJ 3080 Blue Jeans 找最长公共子串(暴力模拟+KMP匹配)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20966 Accepted: 9279 Descr ...
- poj 3080 Blue Jeans(水题 暴搜)
题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...
- POJ 3080 Blue Jeans(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3080 [题目大意] 求k个串的最长公共子串,如果存在多个则输出字典序最小,如果长度小于3则判断查找失败. [题解] 将所有字符串通 ...
- POJ 3080 Blue Jeans 后缀数组, 高度数组 难度:1
题目 http://poj.org/problem?id=3080 题意 有m个(2<=m<=10)不包含空格的字符串,长度为60个字符,求所有字符串中都出现过的最长公共子序列,若该子序列 ...
- poj 3080 Blue Jeans【字符串处理+ 亮点是:字符串函数的使用】
题目:http://poj.org/problem?id=3080 Sample Input 3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCA ...
随机推荐
- python多态
多态是面向对象语言的一个基本特性,多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式.在处理多态对象时,只需要关注它的接口即可,python中并不需要显示的编写(像Java一 ...
- Oracle导出数据结构和数据表的方法
1.PLSQL导出数据结构(数据表.序列.触发器.函数.视图) 1)在左侧 点击tables 2)Tools-->Export User Objects 3)红色1 是你要选择导出的表,红色2 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- 【bzoj3150】 cqoi2013—新Nim游戏
www.lydsy.com/JudgeOnline/problem.php?id=3105 (题目链接) 题意 在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿 ...
- codevs3243 区间翻转
题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N,下一行N个数表示原 ...
- Spynner 安装
Spynner 安装 Windows7 下安装 1.easy_install spynner 2.下载pyqt sip https://sourceforge.net/projects/pyqt/fi ...
- HBase概念学习(十)HBase与MongDB等NoSQL数据库对照
转载请注明出处: jiq•钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数据库,配合以MongDB,Tair等存储. MySQL因为开源,而且生态 ...
- xcrun: error: active developer path ("/Volumes/Xcode/Xcode-beta.app/Contents/Developer") does not exist, use `xcode-select --swi
xcrun: error: active developer path ("/Volumes/Xcode/Xcode-beta.app/Contents/Developer") d ...
- php + mysql 分布式事务(转)
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicity).一个事务是一个不可分割的工作单 ...
- 配置 Apache+php多端口多站点(转载)
配置httpd.conf监听多个端口 #增加监听端口 等以下内容都设置以后,可以通过 netstat -n -a查看端口是否开启 开启虚拟站点 # Virtual hosts#Include conf ...