题解:[Algo Beat Contest 017 A] 串哈希
zhanghanze123 · · 题解
题目大意
给定
- 若
a_i 包含连续子串kirai:- 若当前气压值非负,则把气压值改为
0 。 - 否则不变。
- 若当前气压值非负,则把气压值改为
- 若
a_i 不包含连续子串kirai,但包含连续子串daishuki,则把当前气压值加2 。 - 若
a_i 不包含连续子串kirai和daishuki,但包含连续子串shuki,则把当前气压值加1 。 - 若上述条件都不满足,则把当前气压值减
1 。
假设完成
- 若
t>0 ,输出t-s 。 - 否则输出
shuki。题目分析
按照题意模拟即可,查找连续子串可以用
find()函数。 ::::info[find()函数] 对于一个string类型的字符串a ,我们可以用该函数来查找其是否存在一个连续子串。若存在,返回查找的字符串第一次出现的位置;若不存在,返回npos。 ::::AC Code
#include <bits/stdc++.h> #define int long long using namespace std; inline int input();//快读 void print(int x);//快写 signed main(void){ int n=input(),s=input();//输入 n 和 s int t=s;//方便最后的输出 while (n--){ string str; cin>>str; if (str.find("kirai")!=str.npos) s=(s>=0?0:s);//第一种情况 //这里的判断语句就是说 str 包含连续子串 kirai else if (str.find("daishuki")!=str.npos) s+=2;//第二种情况 else if (str.find("shuki")!=str.npos) ++s;//第三种情况 else --s;//第四种情况 } if (s>0) print(s-t);//如果最后 >0 else puts("shuki");//否则输出 shuki return 0; } inline int input(){int x=0,f=1;char c=getchar();while (!isdigit(c)){if (c=='-') f=-1;c=getchar();}while (isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;} void print(int x){if (x<0){putchar('-');x=-x;}if (x<10) putchar(x+'0');else{print(x/10);putchar(x%10+'0');}}AC 记录