1题意
先给出一些单词构成词典,然后检查所给字符串,是否字典中的单词,如果是则输出“is correct”,或者检查是否满足下面三个条件之一,如果是,那么按输入顺序,输出字典中所有满足条件的单词:
是词典中某个单词中某个字母被替换成另一个字母而得到
是词典中某个单词增加一个字母而得到
是词典中某个单词减少一个字母而得到
2 分析
1)UVA、POJ同样的题目,UVA好像会增加格式要求啊,注意输出的字典中所有满足条件单词之间、以空格为分割,另外,每个案例中间有一行空白:
while(num--){
...
if(num!=0) cout<<endl;
}
2)
对于三个条件,后两个条件和第一个条件的判断方法不同(第一个条件注释的部分,就是会WA的部分),因为第一个条件是两个待比较单词是相同元素个数的,所以必须逐一位置比较!!!否则,如 fi if 本应不符合条件,但是程序会认为符合条件。
3
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct Node{
char value[30];
}cidian_sort[maxn];
char cidian[maxn][30];
int cur=0;
char temp[30];
void Read(){
strcpy(cidian_sort[cur].value,temp);
strcpy(cidian[cur++],temp);
}
bool cmp(struct Node a1,struct Node a2){
//return strcmp(a1.value,a2.value)<0;
return (strcmp(a1.value,a2.value))<0?true:false;
}
int Find(int l,int r){
while(l<=r){
int m=(l+r)>>1;
int st=strcmp(cidian_sort[m].value,temp);
if(st==0)
return m;
else if(st<0){
l=m+1;
}
else if(st>0){
r=m-1;
}
}
return 0;
}
void Judge(){
int len_temp=strlen(temp);
for(int i=0;i<cur;i++){
int len=strlen(cidian[i]);
if(len==len_temp){
int kk=0;
for(int j=0;j<len;j++){
if(kk>=2) break;
if(cidian[i][j]!=temp[j])
kk++;
}
if(kk<2){
cout<<" "<<cidian[i];
}
/*
int temp_id=0;
int kk=0;
for(int j=0;j<len;j++){// if fi
if(kk>=2) break;
if(cidian[i][j]==temp[temp_id]){//fi if
temp_id++;
}
else
kk++;
}
if(temp_id==len_temp-1&&){
cout<<" "<<cidian[i];
//if(strcmp(cidian[i],"if")==0){ cout<<" WRONG ";}
continue;
}
*/
}
else if(len==len_temp+1){
int temp_id=0;
int kk=0;
for(int j=0;j<len;j++){
if(kk>=2) break;
if(cidian[i][j]==temp[temp_id])
temp_id++;
else
kk++;
}
if(temp_id==len_temp){
cout<<" "<<cidian[i];
continue;
}
}
else if(len+1==len_temp){
int cidian_id=0;
int kk=0;
for(int j=0;j<len_temp;j++){
if(kk>=2) break;
if(temp[j]==cidian[i][cidian_id])
cidian_id++;
else
kk++;
}
if(cidian_id==len){
cout<<" "<<cidian[i];
continue;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int num;
scanf("%d",&num);
while(num--){
cur=0;
while(scanf("%s",temp)&&temp[0]!='#'){
Read();
}
sort(cidian_sort,cidian_sort+cur,cmp);
while(scanf("%s",temp)&&temp[0]!='#'){
if(Find(0,cur-1)!=0)
cout<<temp<<" is correct"<<endl;
else{
cout<<temp<<":";
Judge();
cout<<endl;
}
}
if(num!=0) cout<<endl;//每个案例之间空白一行
}
return 0;
}