`
yueqiq
  • 浏览: 15461 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

poj1035 Spell checker

阅读更多

本来就是简单的字符串问题,模拟比较一下就可以,结果因为一个标志位写错调试了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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics