Spell checker

http://poj.org/problem?id=1035

View Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
    char str[20];
    int index;
}ans[10010];
struct Trie
{
    Trie *br[26];
    int index;
    void init()
    {
        index=0;
        for(int i=0;i<26;++i)
            br[i]=NULL;
    }
}*root,tree[150010];

int p;
void build(char *s,int idx)
{
    Trie *t=root;
    for(int i=0;s[i];++i)
    {
        int id=s[i]-'a';
        if(!t->br[id])
        {
            tree[++p].init();
            t->br[id]=&tree[p];
        }
        t=t->br[id];
    }
    t->index=idx;
}

int search(char *s)
{
    Trie *t=root;
    for(int i=0;s[i];++i)
    {
        int id=s[i]-'a';
        if(!t->br[id])
        return 0;
        t=t->br[id];
    }
    return t->index;
}

void repla(char *from,char *to,int pos,char c)
{ //替代某个字符
    strcpy(to,from);
    to[pos]=c;
}

void insert(char *from,char *to,int pos,char c)
{ //插入某个字符
    int len=strlen(from);
    for(int i=0;i<pos;++i)
        to[i]=from[i];
    to[pos]=c;
    for(int i=pos;i<len;++i)
        to[i+1]=from[i];
    to[len+1]='\0';
}

void delet(char *from,char *to,int pos)
{ //删除某个字符
    int len=strlen(from);
    for(int i=0;i<pos;++i)
        to[i]=from[i];
    for(int i=pos;i<len-1;++i)
        to[i]=from[i+1];
    to[len-1]='\0';
}

int cmp(const node &a,const node &b)
{
    return a.index<b.index;
}

int main()
{

    tree[0].init();
    root=&tree[0];
    char str[20],temp[20];
    int idx=1;
    while(scanf("%s",str),str[0]!='#')
    {
        build(str,idx++);
    }
    while(scanf("%s",str),str[0]!='#')
    {
        if(search(str))
        printf("%s is correct\n",str);
        else
        {
            int len=strlen(str);
            int x,cnt=0;
            for(int i=0;i<len;++i)
            {
                delet(str,temp,i);
                if((x=search(temp))!=0)
                {
                    strcpy(ans[cnt].str,temp);
                    ans[cnt++].index=x;
                }
                for(int j=0;j<26;++j)
                {
                    repla(str,temp,i,j+'a');
                    if((x=search(temp))!=0)
                    {
                        strcpy(ans[cnt].str,temp);
                        ans[cnt++].index=x;
                    }
                    insert(str,temp,i,j+'a');
                    if((x=search(temp))!=0)
                    {
                        strcpy(ans[cnt].str,temp);
                        ans[cnt++].index=x;
                    }
                }
            }
            for(int i=0;i<26;++i)
            {
                insert(str,temp,len,i+'a');
                if((x=search(temp))!=0)
                {
                    strcpy(ans[cnt].str,temp);
                    ans[cnt++].index=x;
                }
            }
            sort(ans,ans+cnt,cmp);
            printf("%s:",str);
            if(cnt)
            printf(" %s",ans[0].str);
            for(int i=1;i<cnt;++i)
            if(ans[i].index!=ans[i-1].index)
            printf(" %s",ans[i].str);
            printf("\n") ;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yelan/p/2994214.html