poj3080解题报告(暴力、最大公共子串)
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解题报告(暴力、最大公共子串)的更多相关文章
- Hackerrank 2020 February 2014 解题报告
Hackerrank 2020 February 2014 解题报告 比赛链接 Sherlock and Watson (20分) 题意:给定一个数组,向右平移K次,然后有Q个询问,问第x位置上是几 ...
- USACO Section1.1 Broken Necklace 解题报告
beads解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- 北大ACM试题分类+部分解题报告链接
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...
- 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告
题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 【NOIP2015】提高day2解题报告
题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...
- 2011 ACM-ICPC 成都赛区解题报告(转)
2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠 ...
- 【百度之星2014~初赛(第二轮)解题报告】Chess
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
随机推荐
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- CUDA 进阶学习
CUDA基本概念 CUDA网格限制 1.2CPU和GPU的设计区别 2.1CUDA-Thread 2.2CUDA-Memory(存储)和bank-conflict 2.3CUDA矩阵乘法 3.1 全局 ...
- eclipse 使用gradle构建系统时候报错
今天启动eclipse后,昨天运行正常的gradle项目报错,无法进行编译,错误信息如下: Unable to start the daemon process. This problem might ...
- Chrome多线程模型
为什么使用多线程? Chrome的多线程模型主要解决什么问题? 如何实现该问题的解决? 1. 解决问题 Chrome有很多线程,这是为了保持UI线程(主线程)的高响应度,防止被其他费时的操作阻碍从而影 ...
- Windows10输入法的切换
Alt+Shift 中⇒あ,あ⇒中 Shift 中⇒英,英⇒中 Alt+Caps Lock あ⇒カ,A⇒あ⇒カ Ctrl+Caps Loc ...
- Socket.io:有点意思
个人网站 欢迎品尝 edwardesire.com 下面页面就是使用Socket.io制作的口袋妖怪游戏(默认小屏下已隐藏,请切换到大分辨率查看).左边是游戏画面,右边是按键表和聊天室.画面达到红蓝版 ...
- hibernate 打印sql和参数的配置
1.配置spring-hiberbate.xml:<prop key="hibernate.show_sql">true</prop>--强制打印sql 不 ...
- thymeleaf中的模板布局
一.包括模板片段: 1:定义和引用片段,我们经常会想要包含在模板片段来自其他模板.常见的用途是页脚.标题.菜单…; 为了做到这一点,Thymeleaf需要我们定义包含可用的片段,我们可以通过使用th: ...
- codeforces 653A Bear and Three Balls
A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- 《JavaScript高级程序设计》 读书笔记(二)
数据类型 ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和 String.还有 1 种复杂数据类型--Object,O ...