POJj1035 Spell checker 快排+二分+字符串处理

来源:互联网 发布:数据备份与灾难恢复 编辑:程序博客网 时间:2024/05/06 18:09

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


【思路】


字典按长度分类排序。

对于给定的字符串,在相同长度里面二分查找,如果找到则输出correct。

如果找不到,则在长度减一、相同长度以及长度加一里面分别处理字符串然后查找。

最后把所有符合要求的字符串按要求输出。

注意结果中存在字符串相同的情况。


【代码】


#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 10000;struct dictionary{char s[20];int index;}dict[20][maxn];dictionary re[maxn];int tr;int ct[20];int total;bool cmp(const dictionary &a, const dictionary &b){int t = strcmp(a.s, b.s);if (t>0) return false;else return true;}bool cmp_index(const dictionary &a, const dictionary &b){return a.index < b.index;}int b_s(int len, int begin, int end, char *s){int mid;int t;while(begin<end){ mid = (begin+end)/2;t = strcmp(dict[len][mid].s, s);if (t==0) return mid;else if (t<0) begin = mid+1;else end = mid;}return -1;}void c1(const char *s, int len){char t[20];int i, j;int v;for (i=0; i<len; i++){strcpy(t, s);for (j=i+1; j<=len; j++){t[j-1] = t[j];}v = b_s(len-1, 0, ct[len-1], t);if (v!=-1){strcpy(re[tr].s, t);re[tr].index = dict[len-1][v].index;tr++;}}}void c2(const char *s, int len){char t[20];int i, j;int v;for (i=0; i<len; i++){strcpy(t, s);for (j=0; j<26; j++){t[i] = 'a' + j;if (t[i]==s[i]) continue;v = b_s(len, 0, ct[len], t);if (v!=-1){strcpy(re[tr].s, t);re[tr].index = dict[len][v].index;tr++;}}}}void c3(const char *s, int len){char t[20];int i, j;int v;for (i=0; i<=len; i++){strcpy(t, s);for (j=len; j>=i; j--){t[j+1] = t[j];}for (j=0; j<26; j++){t[i] = 'a' + j;v = b_s(len+1, 0, ct[len+1], t);if (v!=-1){strcpy(re[tr].s, t);re[tr].index = dict[len+1][v].index;tr++;}}}}int main(){char str[20];int len;int i;dictionary temp;memset(ct, 0, sizeof(ct));total = 0;while(scanf("%s", str)){if (str[0]=='#') break;len = strlen(str);strcpy(dict[len][ct[len]].s, str);dict[len][ct[len]].index = total;total++;ct[len]++;}for (i=0; i<16; i++)sort(dict[i], dict[i]+ct[i], cmp);while(scanf("%s", temp.s)){if (temp.s[0]=='#') break;len = strlen(temp.s);if (b_s(len, 0, ct[len], temp.s)!=-1){printf("%s is correct\n", temp.s);}else{printf("%s:", temp.s);tr = 0;c1(temp.s, len);c2(temp.s, len);c3(temp.s, len);sort(re, re+tr, cmp_index);for (i=0; i<tr; i++){if (i>0 && re[i].index==re[i-1].index) continue;printf(" %s", re[i].s);}printf("\n");}}return 0;}