UVA 508 Morse Mismatches(模拟)
508单词匹配
输入:
1.数字或者字母对应的morse编码表(最多不超过6位)
2.字典(最多100个单词)
3.然后输入morse word(长度不超过80)
输出:
只有一个完美匹配 直接输出
多个完美匹配输出第一个跟上'!'
没有完美匹配,输出所有可能的跟上?
完美匹配:
单一匹配:直接输出
多匹配:第一个匹配的直接输出跟上!
无完美匹配:说明出错了,要么缺失要么冗余
display the word from context that matches the longest prefix of morse, or has the
fewest extra elements beyond those in morse.
这句话,你只找最长前缀,还不行,还要保证单词额外的编码元素最少。
也就是说单词编码和morse word编码要尽可能的相似。
如果没有完美匹配的时候,单词要与Morse word有最长前缀的或者最少额外字符。
这两个条件如果要同时满足,只能是添加或者删除最少的元素相等的单词。
输入编码表table
输入字典dic
输入word
if(是否存在完美匹配){
检查有几个完美匹配:
一个完美匹配
直接输出这个
多个完美匹配:
找到第一个输出
}else{
遍历整个字典,找到需要添加或者删除最少的的单词然后输出这个单词
}
检查完美匹配://cnt==0说明没有完美匹配 cnt==1单一完美匹配 cnt>1多匹配
扫描整个字典,如果word有匹配的编码cnt++
return cnt
公共前缀:s1 s2
int cnt = 0;
for(i=0;s1[i]&&s2[i];i++){
if(s1[i]==s2[i]) cnt++;
else break;
}
return cnt;
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char table[256][50]; char dic[105][2][1005];//第一维表示单词的编号 第二维第一个分量表示单词的内容 第二个分量表示单词的编码 int dicNum; int prefix(char s1[],char s2[]){ int i,cnt = 0; for(i=0;s1[i]&&s2[i];i++){ if(s1[i]==s2[i]) cnt++; else break; } return cnt; } int HasPerfect(char s[]){ int cnt = 0,i; for(i=0;i<dicNum;i++){ if(strcmp(s,dic[i][1])==0){ cnt++; } } return cnt; } int abs(int a,int b){ return (a-b)>0?(a-b):(b-a); } int main() { //#define LOCAL #ifdef LOCAL freopen("in","r",stdin); freopen("out","w",stdout); #endif char c; int i; while(cin>>c){ if(c=='*') break; cin>>table[c]; //创建编码表 while(true){ cin>>c; if(c=='*') break; cin>>table[c];//输入对应字符的编码 } //for(i='A';i<='Z';i++) cout<<table[i]<<endl; //for(i='0';i<='9';i++) cout<<table[i]<<endl; //创建字典 dicNum = 0; int len; while(true){ cin>>dic[dicNum][0]; if(dic[dicNum][0][0]=='*') break; //把单词编码 len = strlen(dic[dicNum][0]); strcpy(dic[dicNum][1],"");//把编码置空 for(i=0;i<len;i++){ strcat(dic[dicNum][1],table[dic[dicNum][0][i]]); } dicNum++; } /* for(i=0;i<dicNum;i++){ cout<<dic[i][0]<<" "<<dic[i][1]<<endl; } */ //输入编码 char code[605]; int cnt; while(true){ cin>>code; if(code[0]=='*') break; //cout<<code<<endl; cnt = HasPerfect(code); //cout<<"cnt:"<<cnt<<endl; if(cnt){ for(i=0;i<dicNum;i++){ if(strcmp(dic[i][1],code)==0){ cout<<dic[i][0]; if(cnt>1) {cout<<"!"<<endl;break;} else {cout<<endl;break;} break; } } }else{// //如果没有完美匹配一定出现错误,错误只有两种一种是缺失一种是冗余 //缺失找最长前缀 缺失字符数 //冗余找最少多余字符 冗余字符数 //前缀尽可能的长,冗余尽可能的少 int r; int Min = 99999; int MinI = -1; int pnum,wlen,clen; int Max = -1; int MaxI = -1; for(i=0;i<dicNum;i++){ pnum = prefix(dic[i][1],code); wlen = strlen(dic[i][1]); clen = strlen(code); if(wlen<clen&&pnum==wlen){//添加若干元素 if(clen-wlen<Min){ Min = clen-wlen; MinI = i; } }else if(wlen>clen&&pnum==clen){//添加若干元素 if(wlen-clen<Min){ Min = wlen-clen; MinI = i; } } } cout<<dic[MinI][0]<<"?"<<endl; } } } return 0; }

浙公网安备 33010602011771号