一开始感觉好难啊,除了暴力枚举我想不到其他办法。
然后就去看看别人的思路,发现竟然可以用暴力写!

我也没什么好顾虑的,然后就闷着头去写了。枚举样例第一个DNA串的所有长度大于3的子串,然后用这些和除了第一个DNA串KMP匹配即可。

遇到长的就替换一下,遇到长度相等的取字典序最小的继续替换…没什么弯。
我觉得难点吧,就是枚举所有子串那一部分,那个地方我写的很晕,在加上暴力的代码又那么长,越写越浑。最后把那一块单拉出来写的,最后清楚了。

先附上那一块的代码(枚举长度所有大于3的子串)

#include <iostream>
#include <cstring>using namespace std;char s[60];
char t[60];int main()
{cin >> s;int len1 = strlen(s);for(int i = 3; i<= len1; i++){for(int j = 0; j < len1; ++j){int len2 = 0;for(int k = j;; k++){t[len2++] = s[k];if(len2 == i)break;}t[len2] = '\0';cout << t << endl;}}return 0;
}


这个代码虽然把想要的子串全枚举了,但不符合要求的同样也列出来了(长度小于3的),
这样就会增加时间的复杂度(而且还不少)、、可以剪枝一下。
不过还好啦,我没剪枝最后输出的时候判断答案串长度大于等于3就行,也ac了。如果有强迫症的同学,可以在枚举子串的时候优化一下…
然后把kmp匹配嵌套进去就ok

下面是代码,代码有点长。不过暴力代码一般都这样,没办法,而且我写的可能有点臃肿,但我的思路我觉得还是清晰,就是读起来的时候乱七八糟的变量名可能让人费解…
不过咬牙看也能理解鸭!

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;char DNA[11][66], dna[66], ans[66];
int Next[66];
int len1, len2;
bool flag;void getNext(char *dna)
{int j = 0, t = -1;Next[0] = -1;while(j < len2){if(t == -1 || dna[j] == dna[t]){t++;j++;Next[j] = t;}elset = Next[t];}return;
}bool KMP(char *DNA, char *dna)
{int i = 0, j = 0;while(i < len1 && j < len2){if(j == -1 || DNA[i] == dna[j]){i++;j++;}elsej = Next[j];}if(j >= len2)return true;elsereturn false;
}int main()
{int test;cin >> test;while(test--){int n;cin >> n;for(int i = 0; i < n; ++i){scanf("%s",DNA[i]);}int len_0 = strlen(DNA[0]);//len_0表示第一个串的长度for(int i = 3; i <= len_0; ++i)//子串从3开始,最大的长度为len_0{for(int j = 0; DNA[0][j] != '\0'; ++j){int len  = 0;for(int k = j;; k++){dna[len++] = DNA[0][k];if(len == i)break;}dna[len] = '\0';//以上是列举子串len2 = strlen(dna);//子串长度getNext(dna);for(int j = 1; j < n; ++j){len1 = strlen(DNA[j]);//要匹配的主串长度flag = KMP(DNA[j],dna);if(!flag)break;elsecontinue;}if(flag){int c = strlen(ans);//答案串的长度。//所以一开始答案串的长度为0,我在下面初始化了if(c < len2)strcpy(ans,dna);//留长的if(c == len2){if(strcmp(dna,ans)<0)strcpy(ans,dna);//留小的}}}}if(strlen(ans)>=3)//输出长度大于等于3的答案串cout << ans << endl;elsecout << "no significant commonalities" << endl;memset(ans,0,sizeof(ans));//放在这儿初始化了,因为发现错了才临时加的,放前面比较好}return 0;
}

POJ 3080 Blue Jeans(KMP + 暴力)相关推荐

  1. POJ 3080 Blue Jeans (KMP)

    链接:http://poj.org/problem?id=3080 题目: Description The Genographic Project is a research partnership ...

  2. POJ - 3080 Blue Jeans(暴力+KMP)

    题目链接:点击查看 题目大意:给出n组长度为60的字符串,问这n组中最长的公共连续子串是什么,若有多个不同的最长公共子串,输出字典序最小的那个 题目分析:一开始看到这个题目的时候我是没有想到暴力的.. ...

  3. POJ 3080 Blue Jeans (多个字符串的最长公共序列,暴力比较)

    题意:给出m个字符串,找出其中的最长公共子序列,如果相同长度的有多个,输出按字母排序中的第一个. 思路:数据小,因此枚举第一个字符串的所有子字符串s,再一个个比较,是否为其它字符串的字串.判断是否为字 ...

  4. poj 3080 Blue Jeans

    #include <iostream> //KMP+枚举#include<string>using namespace std;#define len 60char str[1 ...

  5. POJ 3080 - Blue Jeans

    题意: 求所有串的最长公共子串,若有多个输出字典序最小的 分析: 对第一个串的每一个后缀分别与剩下的所有串进行匹配,求得公共子串 对每一个公共子串,记录下最大值即可. 1 #include <i ...

  6. POJ 3080 Blue Jeans (后缀数组)

    题目大意: 求出这些DNA序列中的最长且字典序最小的公共子串. 思路分析: 二分长度的答案,去height中扫描这个长度是否满足,一旦满足就立即输出.这样就能够保证字典序最小了. #include & ...

  7. 暴力枚举(字符串匹配)-Blue Jeans POJ - 3080

    暴力枚举(字符串匹配)-Blue Jeans POJ - 3080 题目: Genographic项目是IBM与国家地理学会之间的研究合作伙伴关系,该合作伙伴正在分析数十万贡献者的DNA,以绘制地球的 ...

  8. poj 3080-Blue Jeans(暴力KMP)

    传送门: poj 3080 题意: 给出一系列长度为60的字符串,让求出它们的最大的公共子序列 题解: 1.既然是公共子序列,那么在其中一个数据里面可能会有一个子串是满足条件的,那么我们可以将其中的一 ...

  9. bzoj 3620: 似乎在梦中见过的样子 kmp暴力

    这道题目感觉上好像是可以用SA过掉的..但是看一下N15000然后Statue里面一个个都6000+ms,翻了一下题解发现是kmp暴力. 打了一半发现不会然后回去看题目,发现位置相同但是结构不懂的子串 ...

  10. poj 1961 Period(KMP)

    题目链接:http://poj.org/problem?id=1961 题目大意:给出一个长为n的字符串,求到每个字符之前有多少个字串循环次数大于1 方法: kmp ,求出这个字符串的next数组.在 ...

最新文章

  1. SAP连接外部ORACLE数据库
  2. MTK OEM Unlock
  3. Android自定义View Paint
  4. Linux密码是一个回文,usermod命令和用户密码管理
  5. 理论应用实例水杯_PLC应用,3个PID控制实例讲解,想不会都难!
  6. python有类似spring_Python的Spring与J的Spring相比
  7. 异常mongodb:Invalid BSON field name XXXXXX:YYYYY.zz
  8. 使用HTML5 / Canvas / JavaScript拍摄浏览器内屏幕截图
  9. 卫星轨道的估计问题(Matlab)(二):扩展卡尔曼滤波(EKF)对新问题的尝试
  10. python魅力_Python逐渐失去魅力
  11. webpack路径问题总结
  12. 32位java jre_jre-7u4-windows-i586.exe|java 1.7.0(Java TM 7)JRE7 32位_最火软件站
  13. springBean生命周期
  14. 如何解决百度识图中图片被限制百度防盗链破解方法
  15. Php计算圆柱的表面积和体积,圆柱体的面积计算公式
  16. 庞加莱买面包的故事(二)
  17. 讲述:一个月薪 12000 的北京程序员的真实生活
  18. 软件公司如何才能留住员工
  19. Java实现视频通话
  20. TCL: an ANN-to-SNN Conversion with Trainable Clipping Layers

热门文章

  1. “新一代信息技术助力疫情防控”开课:百度集团副总裁吴甜详解AI如何抗疫
  2. echarts 生成中国陕西省份(或其他省份)的地图,大屏使用
  3. ASP+VML制作统计图的源程序
  4. 互联网经典算法面试题-验证二叉搜索树
  5. sap服务器之间文件复制,sap跨服务器客户端复制
  6. Pytorch 中的 forward理解
  7. 爬取网易严选某种衣服商品数据,实现可视化,结论有点吓人
  8. 异常事件检测论文汇总(Abnormal Event Detection)
  9. NLP模型(二)——GloVe介绍
  10. 知识管理系统,帮你挖掘出企业90%的隐性知识