单词重组
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Problem Description
在美国数以百万计的报纸中,有一种单词游戏称为猜词。游戏的目标是猜谜,为了找出答案中缺少的字母,有必要对4个单词的字母顺序重新调整。在本题中,你的任务是编写程序实现对单词中的字母顺序重新调整。
Input
输入文件包含4部分:
(1) 一部字典,包含至少1个单词,至多100个单词,每个单词占一行;
(2) 字典后是一行字符串“XXXXXX”,表示字典结束;
(3) 一个或多个被打乱字母顺序的“单词”,每个单词占一行,你必须整理这些字母的顺序;
(4) 输入文件的最后一样为字符串“XXXXXX”,代表输入文件结束。
所有单词,包括字典中的单词和被打乱字母顺序的单词,都只包含小写英文字母,并且至少包含一个字母,至多包含6个字母。字典中的单词不一定是按顺序排列的,但保证字典中的单词是唯一的。
Output
对输入文件中每个被打乱字母顺序的单词w,按字母顺序输出字典中所有满足以下条件的单词的列表:通过调整单词w中的字母顺序,可以变成字典中的单词。列表中的每个单词占一行。如果列表为空(即单词w不能转换成字典中的任何一个单词),则输出一行字符串“NOT A VALID WORD”。以上两种情形都在列表后,输出一行包含6个星号字符的字符串,表示列表结束。
Sample Input
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
******
NOT A VALID WORD
******
course
******
这道题我的思路是读取字典并按照字典顺序排序以后,每读取一个要查找的单词,把这个单词的每一个字母,分别在字典中使用二分查找,找到所有以该字母为首字母的单词,并判断每一个单词是否和要查找的单词都由相同的字母组成,然后按照要求输出即可。
#include<bits/stdc++.h>
using namespace std;
struct dic{
char word[10];
};
int cmp(const void *a,const void *b){
dic *p1 = (dic *)a;
dic *p2 = (dic *)b;
int i = 0;
while(p1->word[i]==p2->word[i])i++;
return p1->word[i]-p2->word[i];
}
bool same(char a[],char b[]){
for(int i = 0;b[i]!='\0';i++){
for(int j = 0;a[j]!='\0';j++){
if(a[j]==b[i]){
a[j]='.';
break;
}
}
}
int i;
for(i=0;a[i]!='\0';i++){
if(a[i]!='.')return false;
}
if(b[i]!='\0')return false;
return true;
}
int findOne(dic dicry[],char ch,int length,char str[]){
int fir,mid,last;
char temp[10];
fir = 0;
mid = length/2;
last= length-1;
while(dicry[mid].word[0] != ch){
if(ch < dicry[fir].word[0] || ch > dicry[last].word[0]){
return 0;
}
if(ch >= dicry[fir].word[0] && ch < dicry[mid].word[0]){
last = mid-1;
mid = (fir + mid)/2;
}
else if(ch > dicry[mid].word[0] && ch <= dicry[last].word[0]){
fir = mid+1;
mid = (last + mid)/2;
}
}
int pos = mid;
while(dicry[pos].word[0]==ch)
pos--;
int pd = 0;
for(int i = pos+1;dicry[i].word[0]==ch;i++){
strcpy(temp,str);
if(same(temp,dicry[i].word)){
pd = 1;
cout<<dicry[i].word<<endl;
}
}
if(pd == 0)
return 0;
else return 1;
}
dic dictionary[105];
int main()
{
char input[10];
int pos = 0;
while(cin>>input && strcmp(input,"XXXXXX")!=0){
strcpy(dictionary[pos].word,input);
pos++;
}
qsort(dictionary,pos,sizeof(dictionary[0]),cmp);
while(cin>>input && strcmp(input,"XXXXXX")!=0){
int pd = 0;
for(int mark = 0;input[mark]!='\0';mark++){
if(findOne(dictionary,input[mark],pos,input)==1)
pd = 1;
}
if(pd == 0){
cout<<"NOT A VALID WORD"<<endl;
}
cout<<"******"<<endl;
}
return 0;
}