P14124 题解
题目传送门
题意简化
给你 \(n\) 个字符串,根据字符串的后缀按要求更改字符串。
题目分析
一般的转换规则可以分为 5 种,如下表。
后缀类型 | 更改后 |
---|---|
chimasu | tte |
rimasu | ^ |
mimasu | nde |
bimasu | ^ |
nimasu | ^ |
kimasu | ite |
gimasu | ide |
shimasu | shite |
根据题意, ikimasu 需要进行特判,转换为 itte。
根据观察,我们发现题目中给出的字符串都是以 masu 结尾的,所以我们只需要判断 masu 前面的部分便能确定是哪种类型。
我们自然而然想到用遍历来判断,但是每句话前面的东西我们不知道有多长。所以,我们需要倒着遍历。建立一个字符串存储去除 masu 后的后缀,直到和上面的任意一种类型匹配。
由于是倒着遍历的,所以我们的判断条件也要倒过来。
int type(string s) {string hz = ""; // 存储后缀for(int i = s.size() - 5; i >= 0; i--) { // 从后往前遍历hz += s[i];if(hz == "ihc" || hz == "ir") return 1;if(hz == "im" || hz == "ib" || hz == "in") return 2;if(hz == "ik") return 3;if(hz == "ig") return 4;if(hz == "ihs") return 5;}
}
确定好类型之后,我们再来确定内容的位置。这里的内容是指去掉后缀的剩余部分。
经过观察,后缀长度有两种,一种是 6 个字符的,一种是 7 个。这里我们用和上面同样的方法判断长度。
int type2(string s) {string hz = "";for(int i = s.size() - 5; i >= 0; i--) {hz += s[i];if(hz == "im" || hz == "ib" || hz == "in" || hz == "ir" || hz == "ik" || hz == "ig") return 1; // 六个字符if(hz == "ihc" || hz == "ihs") return 2; // 七个字符}
}
int len(string s) { // 内容位置if(type2(s) == 2) return s.size() - 7;return s.size() - 6;
}
接下来是替换部分。这部分就很简单了,直接根据上面返回的数值进行拼接就行。为了方便,这里开了一个数组存储更改后的后缀。
string change[] = {"", "tte", "nde", "ite", "ide", "shite"};
// 省略其他部分
ans = str.substr(0, len(str)) + change[type(str)]; // substr(0, n)返回的是字符串下标从 0 开始往后 n 位的字串
下面给出完整代码。
代码
#include<iostream>
#include<string>
using namespace std;
int t;
string str, ans;
string change[] = {"", "tte", "nde", "ite", "ide", "shite"};
int type(string s) {string hz = "";for(int i = s.size() - 5; i >= 0; i--) {hz += s[i];if(hz == "ihc" || hz == "ir") return 1;if(hz == "im" || hz == "ib" || hz == "in") return 2;if(hz == "ik") return 3;if(hz == "ig") return 4;if(hz == "ihs") return 5;}
}
int type2(string s) {string hz = "";for(int i = s.size() - 5; i >= 0; i--) {hz += s[i];if(hz == "im" || hz == "ib" || hz == "in" || hz == "ir" || hz == "ik" || hz == "ig") return 1;if(hz == "ihc" || hz == "ihs") return 2;}
}
int len(string s) {if(type2(s) == 2) return s.size() - 7;return s.size() - 6;
}
int main() {cin >> t ;while(t--) {cin >> str ;if(str == "ikimasu") cout << "itte" << endl;else {ans = str.substr(0, len(str)) + change[type(str)];cout << ans << endl;}}return 0;
}
谢谢观看!