HDU 5311 Hidden String
来源:互联网 发布:linux zip命令详解 编辑:程序博客网 时间:2024/05/17 08:49
题目大意:给一个串S,问是否能找出分别连续的三个串,按顺序拼接起来得到串”anniversary”。
这道题目也是当时bestcoder比赛时的题目,比赛的时候是过了前4题的,但是,终测的时候挂掉了第二道和第三道。这是那场比赛的第二题,到现在我都没有想通,为什么会挂掉!今天又重新写了一下,还是WA!
但是我觉得自己思路是完全正确的。讲讲思路,麻烦大家帮我看看代码,调调BUG。
大概思路:在S串中枚举6个位置,肯定是不行的,因为时间复杂度太高了,就算枚举三个也是很不靠谱的,所以我们只能在串”anniversary”上面做文章。先将串”anniversary”分成三个部分,然后到串S里面分别去找这三个子串就行了,当然,还要注意先后顺序,然后就没有然后了。如果三个串都找到了,那么答案就是“YES”,否则输出“NO”。这样时间复杂度没问题了。
这是WA掉的代码,目前这道题目还没有拿到AC,等到有空的时候再更新一下,先就这样。
#include <bits\stdc++.h>using namespace std;string str, standard = "anniversary";bool find(string str0, string str1, string str2) {//按顺序分别找到三个子串 int i, cnt = 0, N = str.size(); for (i = 0; i + str0.size() < N; ++i) { if (str.substr(i, str0.size()) == str0) { cnt++; break; } } for (; i + str1.size() < N; ++i) { if (str.substr(i, str1.size()) == str1) { cnt++; break; } } for (; i + str2.size() <= N; ++i) { if (str.substr(i, str2.size()) == str2) { cnt++; break; } } return cnt == 3;}int main() { int T; cin >> T; for (int I = 1; I <= T; ++I) { str.clear(); cin >> str; int N = standard.size(); bool ok = false; for (int i = 1; i < N && !ok; ++i) { for (int j = 1; i + j < N; ++j) { string str0 = standard.substr(0, i), str1 = standard.substr(i, j), str2 = standard.substr(i + j); //这里先枚举出"anniversary"三个子串 if (find(str0, str1, str2)) { ok = true; break; } } } cout << (ok ? "YES" : "NO") << endl; } return 0;}
更新于12月3号晚10点左右。
上面的代码真心看不出自己wa在哪里,今晚重新敲了一下代码,居然还就过了,真的想不通。奉上ac代码,只能证明我上面的思路确实是没有错的。
Show me the code!
#include <iostream>#include <vector>using namespace std;string str, standard = "anniversary";int N = standard.size();bool is_find(string t, int &pos) { for (int a = pos; a + t.size() <= str.size(); ++a) { if (t == str.substr(a, t.size())) { pos = a + t.size(); return true; } } return false;}int main() { vector<string> vec; for (int a = 1; a < N; ++a) { for (int b = a + 1; b < N; ++b) { string str0 = standard.substr(0, a), str1 = standard.substr(a, b - a), str2 = standard.substr(b); vec.push_back(str0); vec.push_back(str1); vec.push_back(str2); } } int T; cin >> T; for (int I = 1; I <= T; ++I) { str.clear(); cin >> str; bool ok = false; for (int a = 0; a < vec.size(); a += 3) { int b = 0; if (is_find(vec[a + 0], b) && is_find(vec[a + 1], b) && is_find(vec[a + 2], b)) { ok = true; break; } } cout << (ok ? "YES" : "NO") << endl; } return 0;}
0 0
- HDU 5311:Hidden String
- HDU 5311 Hidden String
- hdu 5311 Hidden String
- hdu 5311 Hidden String
- hdu 5311 Hidden String
- HDU 5311 Hidden String
- hdu 5311 Hidden String 字符串
- hdu 5311 Hidden String dfs
- HDU 5311:Hidden String【字符串】
- hdu 5311 Hidden String(dfs)
- HDU 5311 Hidden String (DFS)
- 【HDU 5311 Hidden String】+ 字符串
- [HDU] 5311 Hidden String [DFS]
- HDU 5311 Hidden String (优美的暴力)
- hdu 5311 Hidden String(dp+暴力dfs)
- hdu 5311 Hidden String(水)
- hdu 5311 Hidden String dp o(n)算法 深搜
- Hidden String(5311)
- HDU5517 沈阳现场赛 二维树状数组
- jmeter的基础入门
- web app 自适应方案总结 关键字 弹性布局之rem
- iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)
- Group by与having理解
- HDU 5311 Hidden String
- OpenGL模型变换和视图变换
- [.Net码农]MVC——入门+最简单的小实例
- 一个i++的教训,多线程问题
- java 基础
- python实现爬虫统计学校BBS男女比例(二)多线程爬虫
- hdoj 素数判定 2012 (素数打表)
- 在Eclipse中创建Maven多模块工程的例子
- 华硕笔记本 FX50J Fn热键无效