1:拼写检查
来源:互联网 发布:淘宝网白的确良布商家 编辑:程序博客网 时间:2024/04/30 03:54
- 总时间限制:
- 2000ms
- 内存限制:
- 65536kB
- 描述
- 现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词A与单词B相似的情况有三种:1、删除单词A的一个字母后得到单词B;2、用任意一个字母替换单词A的一个字母后得到单词B;3、在单词A的任意位置增加一个字母后得到单词B。你的任务是发现词典中与给定单词相同或相似的单词。
- 输入
- 第一部分是词典中的单词,从第一行开始每行一个单词,以"#"结束。词典中的单词保证不重复,最多有10000个。
第二部分是需要查询的单词,每行一个,以"#"结束。最多有50个需要查询的单词。
词典中的单词和需要查询的单词均由小写字母组成,最多包含15个字符。 - 输出
- 按照输入的顺序,为每个需要检查的单词输出一行。如果需要检查的单词出现在词典中,输出“?x is correct",?x代表需要检查的单词。如果需要检查的单词没有出现在词典中,则输出"?x: ?x1 ?x2 ...?xn",其中?x代表需要检查的单词,?x1...?xn代表词典中与需要检查的单词相似的单词,这些单词中间以空格隔开。如果没有相似的单词,输出"?x:"即可。
- 样例输入
iishashavebemymorecontestmetooifaward#meawaremcontesthavooorifimre#
样例输出
me is correctaware: awardm: i my mecontest is correcthav: has haveoo: tooor:i is correctfi: imre: more me
这题新学会了一个BK树。。照着算法打 但不能透彻理解。编辑距离的应用。
推荐链接。http://www.matrix67.com/blog/?s=bk%E6%A0%91
#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<assert.h>#include<ctype.h>#include<stdlib.h>#define min(a,b) (a)>(b)?(b):(a)using namespace std;struct word{ int shunxu; char str[20];};struct node{ word wo; struct node* child[16];//最多15个字符}*root;int flag=0;word ans[3000];int anst=0;int cal_juli(char *a,char *b)//计算编辑距离{ int la = strlen(a); int lb = strlen(b); int i,j; int s[20][20]; for(i=0; i<=la ; i++) s[i][0] = i; for(i=0; i<=lb; i++) s[0][i] = i; for(i = 1; i <= la; i++) for(j = 1; j <= lb; j++) { int cost; if(a[i-1] == b[j-1])cost = 0; else cost = 1; s[i][j] = min(min(s[i][j-1]+1,s[i-1][j] + 1),s[i-1][j-1]+cost); } return s[la][lb];}node* newnode( )//初始化节点。{ node *t; t =(node*)malloc(sizeof(node)); for(int i=0; i<=15; i++) t->child[i] = NULL; return t;}void insert( node *T ,word ss)//照算法建树{ int juli = cal_juli(T->wo.str,ss.str); if( !T->child[juli] ) { T->child[juli] = newnode(); T->child[juli]->wo = ss; } else { insert( T->child[juli],ss); }}void query( node * T,char *str1 ){ if(!T)return; int juli = cal_juli(T -> wo.str, str1 ); if( juli == 0 ) { flag = 1; printf("%s is correct",str1); } else { if(juli == 1){ ans[anst++] = T->wo;} if(!flag) for(int i=juli-1; i<=juli+1&&i<=15; i++) if(T->child[i]) query(T->child[i],str1); }}bool cmp(word a, word b){ return a.shunxu < b.shunxu;}int main(){ //freopen("in.txt","r",stdin); root = newnode(); scanf("%s",root->wo.str); root->wo.shunxu = 0; word temp; int cnt=1; while(scanf("%s",temp.str)&&temp.str[0] != '#') { temp.shunxu = cnt++; insert(root,temp); } char dd[20]; while(scanf("%s",dd)&&dd[0] != '#') { flag = 0; anst=0; query( root, dd); if(!flag) { printf("%s:",dd); sort(ans,ans+anst,cmp);//因为插入时是无序的 需要按要求排序输出。。 for(int i = 0; i < anst; i++) printf(" %s",ans[i].str); } printf("\n"); } return 0;}
0 0
- 1:拼写检查
- 拼写检查
- 拼写检查
- AS SpellCheck拼写检查
- Hunspell拼写检查器
- 拼写检查设计
- 插件8:拼写检查
- Emacs 单词拼写检查
- WPF 文本拼写检查
- emacs 拼写检查
- 【模拟】拼写检查
- vs2008 c++ 拼写检查
- VIM拼写检查
- kile自动检查拼写
- POJ1035-拼写检查
- Word2010取消拼写检查
- 取消MyEclipse拼写检查
- Notepad++关闭拼写检查
- PageModel 分页参数
- Introduction to Receive Side Scaling(RSS)
- 两仪剑法nefu116
- POJ 3155 Hard Life
- no no no. 不要使用kill -9
- 1:拼写检查
- UserCombogridModel用户标记信息
- 两个<c:forEach>设计flag 判断执行
- Unique Paths
- cocos2d-x - 2d跑酷游戏地图素材(TiledMap)
- Storm 集群连接数据库方法
- 子串
- Hadoop 新 MapReduce 框架 Yarn 详解
- 软件开发和团队管理