uva 508(大模拟)

模拟题,最大的坑就是正确理解题意,我英语太菜,读了两遍都没弄懂题意,于是边写边读题才弄明白,但最后还是没读出“无论是有多个相同还是模糊匹配都是按字典序输出第一个”,以为是按输入顺序输出第一个,结果跪了,还有就是模糊匹配只有把那个不完整的

#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;
}

 

完全匹配了才算。

posted on 2017-07-28 19:29  发牌员  阅读(295)  评论(0编辑  收藏  举报

导航