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;
}