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;}
- POJj1035 Spell checker 快排+二分+字符串处理
- poj 1035 Spell checker trie树+快排
- poj 1035 Spell checker ( 字符串处理 )
- POJ Spell checker(1035)-字符串处理
- poj 1035 Spell checker(字符串处理)
- POJ 1035 Spell checker(字符串处理)
- POJ 1035 Spell checker【字符串暴力处理】
- (POJ1035)Spell checker 字符串的处理
- poj_1035 Spell checker(字符串处理)
- POJ 1035 Spell checker 字符串
- POJ1035 Spell checker 字符串模拟
- POJ 1035-Spell checker(字符串)
- POJ 1035 Spell checker (字符串)
- POJ1035-Spell checker(字符串,模拟)
- Spell checker (poj 1035 字符串)
- POJ 1035 Spell checker (字符串模拟)
- POJ 1035:Spell checker:字符串操作
- 字符串 模拟 Spell checker (poj 1035)
- 数据结构中大O时间复杂度推论
- linux下一个启动服务的sh脚本
- java Memento(备忘录模式)
- 宽字符的介绍
- kfifo 一读一写无锁缓冲区中的memory barrier
- POJj1035 Spell checker 快排+二分+字符串处理
- svn在linux下的使用(svn命令)
- 我万事追求苦尽甘来,但一直解决不了如何先洗碗再享受美餐
- DBgrid 第一列加入CheckBox,点击列头 全选/全消
- vim+ctags
- Gedit汇编语法高亮设置
- 用C#实现HTTP协议下的多线程文件传输
- poj 3155(Hard Life)分数规划/最大密度子图
- Visual Studio调试之断点进阶篇