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

完全匹配了才算。

时间: 2024-10-10 09:29:57

uva 508的相关文章

UVa 508 Morse Mismatches (模糊暴力)

题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加或删除尽量少的字符, 使其匹配某个单词并加上“?”. 析:第一次做的时候,一看啥呀,做不了,现在回来看看,发现可以做了,可以使用STL的map来做,首先先把每个字母做一个map, 然后把字典做一个map,最后输入时暴力一下,每个都找一下,这个增加字符可以这样想,就是在和字典比较时,短的在长的字符串中

UVA - 508 Morse Mismatches

Morse Mismatches Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still used in international radio communi

【习题 4-6 UVA - 508】Morse Mismatches

[链接] 我是链接,点我呀:) [题意] 给你每个字母对应的摩斯密码. 然后每个单词的莫斯密码由其组成字母的莫斯密码连接而成. 现在给你若干个莫斯密码. 请问你每个莫斯密码对应哪个单词. 如果有多个单词和他对应.那么输出字典序最小的那个. 如果没有单词和他对应. 那么,你可以删除或者添加若干字母(只能一直删或一直增加) 问你在这种情况下能匹配到的单词(要求添加或者删的单词的数量最小) 如果有多种可能.输出字典序最小的. 如果一直删除.一直增加也找不到. 那么输出所有单词里面字典序最小的哪个. [

UVA 567 Risk【floyd】

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=508 题意:20个点的任意最短路.floyd 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <string> #include <iter

UVa 568 Just the Facts

A过去后看了一下别人的解法,发现除了打表还有一种数论的方法. 分析一下阶乘后面的0是怎么出现的呢,当然是2乘5得到的. 我们将1~N先放在一个数组里面. 从数组第一个元素开始,先统计一下N!中因子为5的个数记为count,将其除去,然后再除去count个2.这样一来的话把所有元素乘起来后就不会出现10的倍数了. 当然并不是真正的乘起来,那样的话肯定是要溢出的,因为只关心最后一位数,所以每次乘完后求10的余数即可. 我的做法是打表,因为题目里给了N <= 10000的条件限制,所以可以把1~100

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED