题解:P17232 [Algo Beat Contest 017 A] 串哈希

· · 题解

本题有一种十分简单的做法,好像与本题名字哈希无关。

C++ STL 库里的 string 类型支持直接查找子串,直接使用 s.find() 即可,括号里是你要查找的内容,那么我们从约束其它子串条件多的 kirai 开始,查找里面有没有,有就按题意修改 s 的值,没有就按题意减一。

注意:如果 find 没找到会返回 string::npos 的一个东西,它不是字符串,不要混淆,它是 size_t 类型的特殊常量,判断是不是 string::npos 就行了。

#include <bits/stdc++.h>
using namespace std;
int n,s;
string t;
int main(){
    cin >> n >> s;
    int old = s;//我这里就直接复制一份,然后在 s 上改了,也可以使用其它写法
    for (int i = 1;i <= n;i++){
        cin >> t;//优先判断忽略规则大的
        if (t.find("kirai") != string::npos){//有没有找到
            if (s >= 0) s = 0;//kirai 的情况
        }else if (t.find("daishuki") != string::npos) s += 2;//daishuki的情况
        else if (t.find("shuki") != string::npos) s += 1;//shuki的情况
        else s--;//没出现的情况
    }
    if (s > 0) cout << s-old;//输出
    else cout << "shuki";
    return 0;//好习惯
}

时间复杂度嘛,反正 n 这么小,不会超时就行了。