返回顶部

白昼夢 / Daydream

做法

一个个判断过去,类似递归。

  • 如果此时子串为 \(eraser\),计数器\(+5\),跳过这个子串。

  • 如果此时子串为 \(erase\),计数器\(+4\),跳过。

  • 如果此时子串为 \(dream\),计数器\(+4\),跳过。

  • 如果此时子串为 \(dreamer\),注意\(er\)可能重复,要判断。

    • \(dreamer\) 时,计数器\(+6\),跳过。

    • 否则是 \(dream...\) 或是 \(dream\),计数器\(+4\),跳过。

把条件筛选后就是正确的了。

代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
string s;
ll n; // 存长度
int main()
{
    cin >> s;
    n = s.size();
    for (int i = 0; i < n; ++i)
    {
        if (s[i] == 'e')
        {
            // 此时有两个可能 eraser 和 erase
            if (s[i + 1] == 'r' && s[i + 2] == 'a' && s[i + 3] == 's' && s[i + 4] == 'e')
            {
                if (s[i + 5] == 'r')
                    i += 5; // 下标不一样,懂吧。。
                else
                {
                    i += 4;
                }
            }
        }
        else if (s[i] == 'd')
        {
            // 此时的可能
            if (s[i + 1] == 'r' && s[i + 2] == 'e' && s[i + 3] == 'a' && s[i + 4] == 'm')
            {
                // 此时有可能会与earse重复
                if (s[i + 5] == 'e' && s[i + 6] == 'r' && s[i + 7] == 'a' && s[i + 8] == 's' && s[i + 9] == 'e')
                    i += 4;
                else if (s[i + 5] == 'e' && s[i + 6] == 'r')
                    i += 6;
                else
                    i += 4;
            }
        }
        else
        {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}

尾声

对于裁剪字符串,可以使用 \(substr()\) 取子串,具体自查。

同步发布于博客园,博客园已发布题解不同步于洛谷。

posted @ 2022-02-07 21:48  zrc4889  阅读(29)  评论(0编辑  收藏  举报