模拟题,最大的坑就是正确理解题意,我英语太菜,读了两遍都没弄懂题意,于是边写边读题才弄明白,但最后还是没读出“无论是有多个相同还是模糊匹配都是按字典序输出第一个”,以为是按输入顺序输出第一个,结果跪了,还有就是模糊匹配只有把那个不完整的
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #include <vector> using namespace std; const int maxn=110; const int inf=0x3f3f3f3f; map<char,string> ma;//表的映射 map<string,vector<string> > jj;//由".-"组成的string对字母数字的映射 string hh[maxn]; int main() { string b; char a; for(int i=1;i<=36;i++)//输入那个表 { cin >> a >> b; ma[a]=b; } string cc; int cnt=0; cin >> cc; while( cin>> cc)//输入字母数字 { if(cc[0]==‘*‘) break; string bb=""; for(int i=0;i<cc.length();i++) { bb=bb+ma[cc[i]];//生成对应”.-“ } jj[bb].push_back(cc);//注意同一个”.-“可能对应多个单词,所以用vector存一下 hh[cnt++]=bb; } for(int i=0;i<cnt;i++) { sort(jj[hh[i]].begin(),jj[hh[i]].end());//按字典序排序 } while(cin >> cc) { if(cc[0]==‘*‘) break; int flag=0,pp=0; for(int i=0;i<cnt;i++) { int k=0; if(hh[i]==cc)//完全匹配 { if(hh[i].length()==cc.length()) { flag=1; if(jj[cc].size()==1) cout << jj[cc][0] << endl; else cout << jj[cc][0] << "!" << endl;//匹配的”.-“对应单词有多个 break; } } } if(!flag)//模糊匹配 { int mini=inf; int mmp,k=0; for(int i=0;i<cnt;i++) { mmp=hh[i].length(); int tt=cc.length(); int mdzz=min(mmp,tt); int j; for(j=0;j<mdzz;j++) { if(cc[j]!=hh[i][j]) break; } int len; if(j==mdzz)//只有cc被匹配结束才能算模糊匹配 { if(mmp>tt) len=mmp-j; else len=tt-j; } else len=inf; if(len<mini) { mini=len; k=i; } } cout << jj[hh[k]][0] << "?" << endl; } } return 0; }
完全匹配了才算。
时间: 2024-10-10 09:29:57