zoukankan      html  css  js  c++  java
  • 【POJ】1035 Spell checker

    字典树。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <vector>
      6 #include <string>
      7 using namespace std;
      8 
      9 typedef struct Trie {
     10     int in;
     11     Trie *next[26];
     12 } Trie;
     13 
     14 Trie root;
     15 char map[10005][25];
     16 int nums[205], nn;
     17 
     18 void create(char str[], int in) {
     19     int i = 0, j, id;
     20     Trie *p = &root, *q;
     21 
     22     while (str[i]) {
     23         id = str[i] - 'a';
     24         ++i;
     25         if (p->next[id] == NULL) {
     26             q = (Trie *)malloc(sizeof(Trie));
     27             q->in = -1;
     28             for (j=0; j<26; ++j)
     29                 q->next[j] = NULL;
     30             p->next[id] = q;
     31         }
     32         p = p->next[id];
     33     }
     34     p->in = in;
     35 }
     36 
     37 int find(char str[], int x) {
     38     int i = 0, id;
     39     Trie *p = &root;
     40 
     41     while (str[i]) {
     42         if (i == x) {
     43             ++i;
     44             continue;
     45         }
     46         id = str[i] - 'a';
     47         ++i;
     48         if (p->next[id] == NULL)
     49             return -1;
     50         p = p->next[id];
     51     }
     52 
     53     return p->in;
     54 }
     55 
     56 void ffind(char str[]) {
     57     int len = strlen(str), i, j, k;
     58     char ch, bk, bf[25];
     59     nn = 0;
     60 
     61     for (i=0; i<=len; ++i)
     62         bf[i] = str[i];
     63     for (i=0; i<len; ++i) {
     64         bk = bf[i];
     65         for (ch='a'; ch<='z'; ++ch) {
     66             if (ch == bk)
     67                 continue;
     68             bf[i] = ch;
     69             j = find(bf, -1);
     70             if (j != -1)
     71                 nums[nn++] = j;
     72         }
     73         bf[i] = bk;
     74     }
     75 
     76     for (i=0; i<len; ++i) {
     77         j = find(bf, i);
     78         if (j != -1)
     79             nums[nn++] = j;
     80     }
     81     bf[len+1] = '';
     82     for (i=0; i<=len; ++i) {
     83         k = j = 0;
     84         while (j<len) {
     85             if (k != i) {
     86                 bf[k] = str[j];
     87                 ++j;
     88             }
     89             ++k;
     90         }
     91         for (ch='a'; ch<='z'; ++ch) {
     92             bf[i] = ch;
     93             j = find(bf, -1);
     94             if (j != -1)
     95                 nums[nn++] = j;
     96         }
     97     }
     98 }
     99 
    100 int comp(const void *a, const void *b) {
    101     return *(int *)a - *(int *)b;
    102 }
    103 
    104 int main() {
    105     int n = 0, f;
    106     char buf[25];
    107 
    108     for (int i=0; i<26; ++i)
    109         root.next[i] = NULL;
    110 
    111     while (scanf("%s", map[n])!=EOF && map[n][0]!='#') {
    112         create(map[n], n);
    113         ++n;
    114     }
    115 
    116     while (scanf("%s", buf)!=EOF && buf[0]!='#') {
    117         f = find(buf, -1);
    118         if (f != -1) {
    119             printf("%s is correct
    ", buf);
    120             continue;
    121         }
    122         ffind(buf);
    123         printf("%s:", buf);
    124         if (nn) {
    125             qsort(nums, nn, sizeof(int), comp);
    126             for (int i = 0; i<nn; ++i) {
    127                 if (i && nums[i] == nums[i-1])
    128                     continue;
    129                 printf(" %s", map[nums[i]]);
    130             }
    131         }
    132         printf("
    ");
    133     }
    134 
    135     return 0;
    136 }
  • 相关阅读:
    三种方法
    渐渐明白
    出手的时候到了
    URL OpenDocument
    熟练使用IDT
    时间快到了
    还是这样
    接口的多态性
    接口(interface)的使用
    抽象类(abstract class)与抽象方法
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3812393.html
Copyright © 2011-2022 走看看