Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 10052 | Accepted: 3713 |
Description
Input
Output
Sample Input
i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Sample Output
me is correct aware: award m: i my me contest is correct hav: has have oo: too or: i is correct fi: i mre: more me
Source
//类似暴力,主要是缩小了查找范围,注意要按照输入时候的字典序输出 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct T { char s[20]; int len; int num; } d[10010],a[10010]; bool cmp(T a,T b) { return a.len<b.len;//按长度排序,只搜索n-1,n,n+1这三种长度范围 } bool cmp1(T a,T b) { return a.num<b.num; } int main() { int num=0; int c[20];//记录长度的数组,以便搜索长度 while(scanf("%s",d[num].s)) { if(d[num].s[0]=='#') break; d[num].num=num; d[num].len=strlen(d[num].s); num++;//0--num(不包括num) } sort(d,d+num,cmp); for(int i=0; i<20; i++) c[i]=-1; int cou=d[0].len; c[cou]=0; for(int i=0; i<num; i++) if(d[i].len!=cou) { cou=d[i].len; c[cou]=i;//长度为cou的串从i开始 } char str[20]; while(scanf("%s",str)) { int count=0; if(str[0]=='#') break; bool flag=1; int l=strlen(str); //从l开始找有没有一样的串,可以使用二分加速 for(int i=c[l]; i<num; i++) { if(i==-1) break;//不存在和目标串相同长度的串 if(d[i].len!=l) break;//说明已经不可能有一样的串了 if(strcmp(d[i].s,str)==0) { printf("%s is correct/n",str); flag=false; break; } } if(!flag) continue; printf("%s:",str);//开始使用线性查找 cou=-1; cou=c[l-1]; if(cou!=-1) { for(int i=cou; i<num; i++) { if(d[i].len!=l-1) break; int j,k; for(j=0,k=0; j<d[i].len; j++,k++) if(d[i].s[j]!=str[k])//因为str多一个字符 { j--; if((k-j)>1) break; } if(k-j<=1) a[count++]=d[i]; } } cou=c[l]; if(cou!=-1) { for(int i=cou; i<num; i++) { if(d[i].len!=l) break; int j,k=0; for(j=0; j<d[i].len; j++) if(d[i].s[j]!=str[j])//因为str多一个字符 { k++; if(k>1) break; } if(k<=1) a[count++]=d[i]; } } cou=c[l+1]; if(cou!=-1) { for(int i=cou; i<num; i++) { if(d[i].len!=l+1) break; int j,k; for(j=0,k=0; j<d[i].len; j++,k++) if(d[i].s[j]!=str[k])//因为str多一个字符 { k--; if(j-k>1) break; } if(j-k<=1) a[count++]=d[i]; } } sort(a,a+count,cmp1); for(int i=0;i<count;i++) printf(" %s",a[i].s); printf("/n"); } return 0; }