您的位置:首页 > 其它

poj1035 Spell checker

2012-08-06 17:03 417 查看
本来就是简单的字符串问题,模拟比较一下就可以,结果因为一个标志位写错调试了20多分钟。。。

code

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <limits>
#include <vector>
#include <bitset>
#include <string>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <string.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
#define Si set<int>
#define LL long long
#define pb push_back
#define PS printf(" ")
#define Vi vector<int>
#define LN printf("\n")
#define SD(a) scanf("%d",&a)
#define PD(a) printf("%d",a)
#define SET(a,b) memset(a,b,sizeof(a))
#define FF(i,a) for(int i(0);i<(a);i++)
#define FD(i,a) for(int i(a);i>=(1);i--)
#define FOR(i,a,b) for(int i(a);i<=(b);i++)
#define FOD(i,a,b) for(int i(a);i>=(b);i--)
#define readf freopen("input.txt","r",stdin)
#define writef freopen("output.txt","w",stdout)
const int maxn = 10001;
const int INF = 0x3fffffff;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const double pi = acos(-1.0);
using namespace std;
char dict[10001][16];
char check[51][16];
int dlen[10001],clen[51];
int path[10001];
bool replace(int cn,int dn){
int cnt=0;
FF(i,dlen[dn]){
if(check[cn][i]!=dict[dn][i]) cnt++;
if(cnt>1) return false;
}
return true;
}
bool del(int cn,int dn){
int i,j,cnt;
i=j=cnt=0;
while(j<dlen[dn]){
if(check[cn][i]!=dict[dn][j]){
i++;
cnt++;
if(cnt>1) return false;
}else{
i++;
j++;
}
}
return true;
}
bool insert(int cn,int dn){
int i,j,cnt;
i=j=cnt=0;
//printf("clen %d\n",clen[cn]);
while(i<clen[cn]){
//printf(" %c  %c \n",check[cn][i],dict[dn][j]);
if(check[cn][i]!=dict[dn][j]){
j++;cnt++;
//PD(cnt);LN;
if(cnt>1) return false;
}else{
i++;
j++;
}
}
return true;
}
int main(){
//readf;
char tmp[16];
int N=0,M=0;
while(~scanf("%s",tmp)&&tmp[0]!='#'){
strcpy(dict[++N],tmp);
}
while(~scanf("%s",tmp)&&tmp[0]!='#'){
strcpy(check[++M],tmp);
}
FOR(i,1,N) dlen[i]=strlen(dict[i]);
FOR(i,1,M) clen[i]=strlen(check[i]);
//printf("%d\n",insert(3,6));
int pos=0;
FOR(i,1,M){
bool flag=false;
pos=0;
FOR(j,1,N){
if(clen[i]==dlen[j]){
if(!strcmp(check[i],dict[j])){
flag=true;
break;
}else{
if(replace(i,j)) path[++pos]=j;
}
}
if(clen[i]+1==dlen[j]){
if(insert(i,j)) path[++pos]=j;
}
if(clen[i]==dlen[j]+1){
if(del(i,j)) path[++pos]=j;
}
}
if(flag) printf("%s is correct\n",check[i]);
else{
printf("%s:",check[i]);
FOR(j,1,pos){
printf(" %s",dict[path[j]]);
}
LN;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: