| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哪位大牛帮看看,怎么老是WA啊。hash+二分查找//poj1035 --spell checker
#include<iostream>
#define MAX 393
#include<vector>
#include<algorithm>
using namespace std;
#include<stdlib.h>
struct words
{
char word[20]; //字典单个字符串
int count; //在字典中第几个出现
};
int maxnumber[MAX];
int number;
words lihao[MAX][10000];
bool cmp(words& x,words& y)
{
return x.count <y.count ;
}
int compare(const void* x,const void* y)
{
if( strcmp(((words*)x)->word,((words*)y)->word)>0 )
return 1;
else if(strcmp(((words*)x)->word,((words*)y)->word)<0)
return -1;
else
return 0;
}
//判断两个字符串是否只有一个字母不同
bool check(char* x,char* y)
{
int num1=0,num2=0;
while(x[num1]!='\0')
++num1;
while(y[num2]!='\0')
++num2;
if(num1==num2)
{
int countoferror=0;
for(int i=0;i!=num1;++i)
if(x[i]!=y[i])
++countoferror;
if(countoferror==1)
return true;
else
return false;
}
else if(num1-num2==1)
{
int i=0,j=0;
bool check1=true,check2=true;
for(;i!=num1 && j!=num2;)
if(x[i]!=y[j])
{
if(check1==false)
{
check2=false;
break;
}
else
{
++i;
check1=false;
}
}
else
++i,++j;
return check2;
}
else if(num1-num2==-1)
{
int i=0,j=0;
bool check1=true,check2=true;
for(;i!=num1 && j!=num2;)
if(x[i]!=y[j])
{
if(check1==false)
{
check2=false;
break;
}
else
{
++j;
check1=false;
}
}
else
++i,++j;
return check2;
}
else
return false;
}
int main()
{
memset(maxnumber,0,sizeof(maxnumber));
char temp[16];
number=0;
int k;
while(cin>>temp,temp[0]!='#')
{
words tt;
strcpy(tt.word ,temp );
tt.count =number++;
int num=0;
k=0;
//hash既字符串各项字母和a的差之和
while(temp[k]!='\0')
num+=(temp[k]-'a'),++k;
lihao[num][maxnumber[num]++]=tt;
}
int i,j;
for(i=0;i!=MAX;++i)
sort(lihao[i],lihao[i]+maxnumber[i],cmp);
while(cin>>temp,temp[0]!='#')
{
int num=0;
k=0;
//hash方法和上面的相同
while(temp[k]!='\0')
num+=(temp[k]-'a'),++k;
words* zhaomin=new words;
strcpy(zhaomin->word,temp);
//二分查找
words* iter=(words*)bsearch(zhaomin,lihao[num],maxnumber[num],sizeof(words),compare);
if(iter!=NULL)
cout<<temp<<" is correct"<<endl;
else
{
vector<words> paixu;
for(j=num-25>=0?num-25:0;j!=num+26 && j!=MAX;++j)
for(i=0;i!=maxnumber[j];++i)
if(check(temp,lihao[j][i].word))
paixu.push_back(lihao[j][i]);
sort(paixu.begin(),paixu.end(),cmp);
cout<<temp<<":";
for(i=0;i!=paixu.size();++i)
if(strcmp(paixu[i].word,temp)!=0)
cout<<" "<<paixu[i].word;
cout<<endl;
}
delete zhaomin;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator