题意:给出的一些已知字符串,在数字编码对应的情况下翻译给出的数字译码
思路:第一次尝试的时候,是想着如何把给出的数字译码翻译出来再进行一一对应比较,但是后来发现情况太多不好操作,采用逆向方法来进行操作更加的简单,将给出的字符串按照对应关系翻译成数字译码,在进行比较,不是一个很难的题
用到了stl中的stringsteam来进行字符串空格键的分割,很好使,不用跑循环
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,string> mp;
map<string,int> mp2;
vector<string> vt;
void solve(){
int m;
// cin>>m;
// getchar();//需要2个getchar()来吸收空格
// getchar();
scanf("%d\n",&m);
int cnt=0;
for(int i=1;i<=m;i++){
vt.clear();
string s;
cnt++;
int flag=1;
ll ans=1;//记录可进行翻译所得的数目
getline(cin,s);
stringstream ss(s);//通过使用stringsteam来根据字符串之间的空格进行分割字符串
while(ss>>s){//得到空格分开的单一字符串
if(mp.find(s)==mp.end()){//没有找到匹配的
flag=2;
break;
}
else if(mp2[s]!=1){//找到了匹配的,但是数目不唯一,有多种可能
ans*=mp2[s];
flag=3;
}
else{
vt.push_back(mp[s]);
}
}
if(flag==2){
printf("Message #%d: not a valid text\n",cnt);
cout<<"\n";
}
else if(flag==3){
printf("Message #%d: there are %d possible messages\n",cnt,ans);
cout<<"\n";
}
else if(flag==1){
printf("Message #%d: ",cnt);
for(int i=0;i<vt.size();i++){
cout<<vt[i];
if(i==vt.size()-1){
cout<<endl;
}
else{
cout<<" ";
}
}
cout<<endl;
}
}
}
int main(){
int n;
cin>>n;
string s;
//在无法将给出的译码转换成字符串在进行匹配时,将已知的字符串转换成数字译码,在进行匹配
//逆向解法
for(int i=1;i<=n;i++){
cin>>s;
string temp="";
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]=='a'||s[i]=='b'||s[i]=='c') temp+='2';
if(s[i]=='d'||s[i]=='e'||s[i]=='f') temp+='3';
if(s[i]=='g'||s[i]=='h'||s[i]=='i') temp+='4';
if(s[i]=='j'||s[i]=='k'||s[i]=='l') temp+='5';
if(s[i]=='m'||s[i]=='n'||s[i]=='o') temp+='6';
if(s[i]=='p'||s[i]=='q'||s[i]=='r'||s[i]=='s') temp+='7';
if(s[i]=='t'||s[i]=='u'||s[i]=='v') temp+='8';
if(s[i]=='w'||s[i]=='x'||s[i]=='y'||s[i]=='z') temp+='9';
}
mp[temp]=s;//重新存储给出的已知字符串
mp2[temp]++;//记录不同字符串对应的译码若有相同的,记录下数量
}
solve();
return 0;
}