SDUT 2023 summer team contest(for 22) - 5 - Virtual Judge (vjudge.net)
开三个map简化了代码
用到的stl及相关字符串输入等等:getline输入包含空格的字符串,
s.substr(pos,len),mp.count(x)看是否出现过
:先getline输入一行字符串,再对字符串while循环得出每个字符串并进行操作输出
注意先mp4再mp3再mp2
(此题一开始想用打表做,s.find查找有无该字符串,有的话就进行s.replace更换,但是最后发现find函数可能会将已更换过的字符再合成更换,有点bs了)
#include <bits/stdc++.h>
#define PI 3.14159265358979323
//#define int long long
#define Close ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e5+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
//typedef pair<int,int> pii;
/*vector<pii> q(N);
vector<int> g[N];
set<int> s1;
map<string,vector<string>> mpp;
unordered_map<int,int> ump;
map<pair<double,double>,int> mmp;*/
string s;
map<string,char> mp2;
map<string,char> mp3;
map<string,char> mp4;
void solve()
{
mp2["iu"]='q';
mp2["ei"]='w';
mp3["uan"]='r';
mp2["ue"]='t';
mp2["un"]='y';
mp2["sh"]='u';
mp2["ch"]='i';
mp2["uo"]='o';
mp2["ie"]='p';
mp3["ong"]='s';
mp4["iong"]='s';
mp2["ai"]='d';
mp2["en"]='f';
mp3["eng"]='g';
mp3["ang"]='h';
mp2["an"]='j';
mp3["uai"]='k';
mp3["ing"]='k';
mp4["uang"]='l';
mp4["iang"]='l';
mp2["ou"]='z';
mp2["ia"]='x';
mp2["ua"]='x';
mp2["ao"]='c';
mp2["zh"]='v';
mp2["ui"]='v';
mp2["in"]='b';
mp3["iao"]='n';
mp3["ian"]='m';
while(getline(cin,s))
{
for(int i=0;i<s.size();i++)
{
string ss="";
while(s[i]!=' '&&i<=s.size()-1)
{
ss+=s[i];
i++;
}
if(ss.size()==1) cout<<ss<<ss;
else if(ss.size()==2) cout<<ss;
else if(ss=="ang") cout<<"ah";
else if(ss=="eng") cout<<"eg";
else if(ss=="ong") cout<<"os";
else
{
for(int j=0;j<ss.size();j++)
{
if(mp4.count(ss.substr(j,4)))
{
cout<<mp4[ss.substr(j,4)];
j+=3;
}
else if(mp3.count(ss.substr(j,3)))
{
cout<<mp3[ss.substr(j,3)];
j+=2;
}
else if(mp2.count(ss.substr(j,2)))
{
cout<<mp2[ss.substr(j,2)];
j+=1;
}
else cout<<ss[j];
}
}
cout<<" ";
}
cout<<endl;
}
}
signed main()
{
Close
int T;
T=1;
//cin>>T;
while(T--)
{
solve();
}
return 0;
}