混杂游戏
问题描述:以前流行玩一种文字游戏—混杂。作为混杂就是在一个已知的答案中解读一串被打乱的字符串。你的任务是写一个程序,解读这个难题。
输入:
输入的一行是一个整数(1<=T<=100),表示有几组输入数据。
每组输入由4部分组成:
(1)一个字典,最多包含2000个单词,每个单词一行。
(2)一行字符串”XXXXXX”,作为字典部分的结束标志。
(3)1个或多个( 最多2000个 )需要解读的字符串。每个一行。
(4) 一行字符串”XXXXXX”,作为解读部分的结束标志。
以上的每个单词都只有小写字母组成,最长不超过10。字典不一定是有序的。单词是唯一的。
输出:
每组输出中,对应每个解读串A,如果有一个串B和A由相同的字母组成,则认为B可以解读A。在字典中找到所有可以解读A的串,并且以字典的顺序输出,每个单词一行,然后输出一行“*” 。如果没有找到符合条件的字符串,就输出一行“NO ONE“,然后输出一行 ”*“。
Sample Input
1
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX
Sample Output
score
refund
part
tarp
trap
NO ONE
course
Source
典型的字典树,yes?
here I tried to use a little easy method~
record every letter’s occurance in each word
and use stl in vector, use it to save string in dictionary
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
#define M 2005
int a[M][26], b[26];
vector<string> vecDic;
void main()
{
int iInputNumber;
scanf("%d", &iInputNumber);
string sString;
int flag;
int i, j, index;
while (iInputNumber--)
{
vecDic.clear();
index = 0;
// 输入每一组字典
while (cin>>sString && sString!="XXXXXX")
{
vecDic.push_back(sString);
index++;
}
sort(vecDic.begin(), vecDic.end());
for (i=0; i<index; i++)
{
for (j=0; j<26; j++)
a[i][j] = 0;
for (j=0; j<vecDic[i].length(); j++)
a[i][vecDic[i][j]-'a']++;
}
// 输入需要猜测的单词。
while (cin>>sString && sString!="XXXXXX")
{
for (i=0; i<26; i++)
b[i] = 0;
for (i=0; i<sString.length(); i++)
b[sString[i]-'a']++;
// 用来表示字典中是否有该单词的。
flag = 0;
for (i=0; i<index; i++)
{
for (j=0; j<26; j++)
{
if (a[i][j] != b[j])
break;
}
if (j==26)
{
cout << vecDic[i] << endl;
flag = 1;
}
}
if (!flag)
cout << "NO ONE" << endl;
cout << "******" << endl;
}
}
}
第二种方法:
把每个字典的单词拆散,按字母顺序排序,用map与其原来的单词对应。
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include<map>
using namespace std;
multimap<string,string>dic;
multimap<string,string>::iterator it,it2;
void main()
{
int T;
scanf("%d",&T);
string str;
int flag;
while(T--)
{
int sub=1;
dic.clear();
while(cin>>str&&str!="XXXXXX")
{
string temp=str;
sort(str.begin(),str.end());
//dic[str]=temp;
dic.insert(pair<string,string>(str,temp));
}
string rec[2000];
while(cin>>str&&str!="XXXXXX")
{
sort(str.begin(),str.end());
flag=0;
it=dic.find(str);
if(it==dic.end())
cout<<"NO ONE"<<endl;
else
{
int index=0;
for(it2=it;it2!=dic.end();it2++)
{
if((*it2).first!=str)
break;
else rec[index++]=(*it2).second;
}
sort(rec,rec+index);
for(int i=0;i<index;i++)
cout<<rec[i]<<endl;
//cout<<(*it2).second<<endl;
}
cout<<"******"<<endl;
}
}
}