POJ 3080,题目链接http://poj.org/problem?id=3080

题意:

就是求m个长度为60的字符串的最长连续公共子串,2<=m<=10

规定:

1、最长公共串长度小于3输出no significant commonalities

2、若出现多个等长的最长的子串,则输出字典序最小的串

思路:

1. 求公共最小连续子串,那么先把第一个串长度>=3的所有连续子串找出来,然后由短到长查看所有主串是否有该子串。

2. 如果发现一个公共子串,那么就开始找长度+1的公共子串;如果指定长度的所有子串都找不出一条是共有的,那么-1长度就是最长的公共子串。

例:长度为3的子串匹配时,当发现第一个长度为3的公共子串,则开始找长度为4的子串,如果发现第一个长度为4的子串,则开始找长度为5的子串,如果没有找到长度为5的公共子串,那么他们的最长公共子串长度就为4,此时就在长度为4的所有子串中,找出字典排序在前的。(暴力~)

代码:

//680K	32MS
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using std::string;
using std::vector;
#define DNA_Len 60 bool BMSearch(const char* s, const char* t)
{
const char *p = strstr(s, t);
if (p) return true;
else return false;
} int main()
{
char temp[DNA_Len+1];
vector<string> subStr[DNA_Len+1]; // 3-60 int caseNum;
scanf("%d",&caseNum);
while (caseNum-- > 0)
{
int deqNum;//2 <= m <= 10
scanf("%d", &deqNum);
char **p = new char*[deqNum];
for (int i=0; i<deqNum; ++i)
{
p[i] = new char[DNA_Len+1];
memset(p[i], 0, DNA_Len+1);
scanf("%s", p[i]);
}
//1. 获取第一个串中 长度为3-60的所有子串 (小于3的输出no significant commonalities)
for (int len=3; len<=60; ++len){
subStr[len].clear();
for (int i=0; i<=60-len; ++i){
strncpy(&temp[0], p[0]+i, len);
temp[len] = 0;
subStr[len].push_back(temp);
}
}
//2. 子串由少到多 再deqNum个主串中查找, 如果都有该子串 则保存后查找下一个长度的子串,直到找不到
memset(temp, 0, DNA_Len+1);
bool hasOneNotGot; //标记 deqNum个主串中,如果有一个没有找到那么就为true
for (int subStrLen=3; subStrLen<=60; ++subStrLen){
for (int subNum=0,count=subStr[subStrLen].size(); subNum<count; ++subNum){
hasOneNotGot = false;
for (int strIdx=0 ; strIdx<deqNum; ++strIdx){
if (! BMSearch(p[strIdx], subStr[subStrLen].at(subNum).c_str())){
hasOneNotGot = true;
break;
}
}
if (! hasOneNotGot) { //找到了就退出,找下一个长度的串,没找到就继续
strcpy(temp, subStr[subStrLen].at(subNum).c_str());
break;
}
}
if (hasOneNotGot){ //该长度的子串没有找到 那么temp是最长的子串 或temp为空
break;
}
} if (strlen(temp) >= 3){
//多个最长子串 按照字典排序
int len = strlen(temp);
vector<string> multiString;
bool searched;
for (int i=0,count=subStr[len].size(); i<count; ++i)
{
searched = true;
for (int strIdx=0 ; strIdx<deqNum; ++strIdx){
if (! BMSearch(p[strIdx], subStr[len].at(i).c_str())){
searched = false;
break;
}
}
if (searched) multiString.push_back(subStr[len].at(i));
}
strcpy(temp, multiString.at(0).c_str());
for (int i=1,count=multiString.size(); i<count; ++i)
{
if (strcmp(temp, multiString.at(i).c_str()) > 0){
strcpy(temp, multiString.at(i).c_str());
}
}
printf("%s\n", temp);
}
else {
printf("no significant commonalities\n");
} for (int i=0; i<deqNum; ++i) delete [](p[i]);
delete []p;
} return 0;
}

poj3080解题报告(暴力、最大公共子串)的更多相关文章

  1. Hackerrank 2020 February 2014 解题报告

    Hackerrank 2020 February 2014 解题报告 比赛链接 Sherlock and Watson (20分) 题意:给定一个数组,向右平移K次,然后有Q个询问,问第x位置上是几 ...

  2. USACO Section1.1 Broken Necklace 解题报告

    beads解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  3. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  4. 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告

    题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...

  5. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  6. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  7. 【NOIP2015】提高day2解题报告

    题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...

  8. 2011 ACM-ICPC 成都赛区解题报告(转)

    2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠 ...

  9. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

随机推荐

  1. Ubuntu中使用pyUSB读取鼠标或键盘的数据程序

    参考 :http://www.orangecoat.com/how-to/read-and-decode-data-from-your-mouse-using-this-pyusb-hack 要注意的 ...

  2. 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)

    // 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...

  3. C++ 我想这样用(七)

    话接前篇,继续基于对象编程语法的剩余部分: 6.类的const成员函数和const对象 const数据成员:跟const常量一样,只是一个在类里(而且是在构造函数里),一个在类外而已,都必须初始化. ...

  4. linux网络编程笔记——TCP

    1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...

  5. 【sgu282】Isomorphism

    题意: 给出n(n<=53)点的无向完全图 要将每条边染上m(m<=1000)种颜色的一种 只改变顶点编号的图视为同种方案 求本质不同方案数%p(p>n且为质树)的值 题解: 这题貌 ...

  6. HDU 5826 physics (积分推导)

    physics 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5826 Description There are n balls on a smoo ...

  7. 当心回车符破坏你的JSON数据

    今天发现系统中一个地方获取JSON数据时,时而失败,时而成功,最后发现是回车符搞的鬼. 当你的JSON中有回车符时,会致使你的JSON出现格式错误:解决办法是在保存数据,或整理数据向客户端输出时将回车 ...

  8. scp命令获取远程文件

    一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的,可能会稍微影响 ...

  9. 转载 SQL Server中索引管理之六大铁律

    转载原地址 http://jingyan.baidu.com/article/48a42057c03bd7a924250429.html 索引是以表列为基础的数据库对象.索引中保存着表中排序的索引列, ...

  10. HDU 4431 Mahjong (DFS,暴力枚举,剪枝)

    题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...