思路
题目已经说的很清楚了,这里我再补充一点。
如果一位选手同时可能拥有多种身份,那么三种身份的优先级从大到小为:见祖宗人,乐子人,普通人。
所以我将三种身份在程序中处理的编号分别设为:
身份 | 编号 |
---|---|
普通人 | $0$ |
见祖宗人 | $2$ |
乐子人 | $1$ |
由于见祖宗人的判断是基于子串的,所以我们要先确保字符串长度大于 $10$(即 //freopen(
的长度)
另外,见祖宗人注释的 freopen
语句不一定要是正确的。如果你搞错了这一点,那么你只能得到 $30$ 分。
代码
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define elif else if
int t, n, m;
string title[5], fin, fout;
int main()
{
cin >> t >> n >> m;
for (int i = 1; i <= m; i++)
cin >> title[i];
for (int i = 1; i <= n; i++)
{
int type = 0;//0普通人 1乐子人 2见祖宗人
//这样编号,后面在确定身份时就可以直接取max,不用考虑优先级
for (int j = 1; j <= m; j++)
{
cin >> fin >> fout;
if (fin == "freopen(\"" + title[j] + ".in\",\"r\",stdin);" && fout == "freopen(\"" + title[j] + ".out\",\"w\",stdout);")//普通人
type = max(0, type);
elif ((fin.size() >= 10 && fin.substr(0, 10) == "//freopen(" && fin.substr(fin.size() - 2) == ");") || (fout.size() >= 10 && fout.substr(0, 10) == "//freopen(" && fout.substr(fout.size() - 2) == ");"))//见祖宗人
type = max(2, type);
else//乐子人
type = max(1, type);
}
if (type == 0)//普通人
cout << "PION2202 RP++." << endl;
elif (type == 2)//见祖宗人
cout << "Wrong file operation takes you to your ancestors along with your 3 years' efforts on OI." << endl;
else//乐子人
cout << "Good luck and have fun." << endl;
}
return 0;
}