HDU 5311 Hidden String

原创 2015年11月19日 22:21:46

题目大意:给一个串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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 5311:Hidden String【字符串】

Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)...

hdu 5311 Hidden String dfs

Hidden String Accepts: 437 Submissions: 2174 问题描述 今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为nn的字符串ss. ...

Hidden String(5311)

Hidden String(5311)

HDOJ 5311-Hidden String【深搜】

Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string s of length n. H...

hdoj5311Hidden String

Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)...

杭电5311-Hidden String(暴力列举)

Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other...
  • nvliba
  • nvliba
  • 2015年12月06日 18:10
  • 277

HDOJ 5533-Hidden String

The sky was brushed clean by the wind and the stars were cold in a black sky. What a wonderful night...

BestCoder 1st Anniversary ($) 1002.Hidden String

Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others) Me...

Hidden String

Problem Description Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a st...

Hidden String(模拟)

Link:http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5311 Hidden String
举报原因:
原因补充:

(最多只允许输入30个字)