题目链接。
分析:
对于该题,使用的是字典树。暴力。不过一开始忽略了个问题:
对于第三个inserting of one arbitrary letter into the word.
忽略了一种情况。那就是有字符串中含有相邻的相同字符。例如,aab,
在0号插入a和1号插入a,新得到的字符串都是aaab。在输出时注意下就行了。
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TrieNode{ int flag, order; struct TrieNode *next[27]; }TrieNode; struct Node{ char s[20]; int order; }ans[10010]; int cnt; TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = (TrieNode *)malloc(sizeof(TrieNode)); p->flag = 0; p->order = 0; for(i=0; i<26; i++) p->next[i] = NULL; return p; } void Insert(TrieNode **T, char *s){ TrieNode *p; int i, len, k; if(!(p = (*T))) p = (*T) = CreateTrieNode(); len = strlen(s); for(i=0; i<len; i++){ k = s[i] - 'a'; if(!p->next[k]) p->next[k] = CreateTrieNode(); p = p->next[k]; } p->flag = 1; p->order = cnt++; } int search(TrieNode *T, char *s){ TrieNode *p = T; int i, len, k; len = strlen(s); for(i=0; i<len; i++){ k = s[i] - 'a'; if(!p->next[k]) return 0; p = p->next[k]; } if(p->flag){ ans[cnt].order = p->order; strcpy(ans[cnt++].s, s); return 1; } else return 0; } int cmp(const void *a, const void *b){ struct Node x = *(struct Node *)a, y = *(struct Node *)b; return x.order - y.order; } int main(){ TrieNode *T = NULL; char s[20], s1[20]; int i, len, j, k, flag; cnt = 0; while(scanf("%s", s) == 1 && s[0] != '#'){ Insert(&T, s); } while(scanf("%s", s) == 1 && s[0] != '#'){ if(search(T, s)) printf("%s is correct\n", s); else{ flag = 1; cnt = 0; len = strlen(s); for(i=0; i<len; i++) if(!(s[i] >= 'a' && s[i] <= 'z')){flag = 0; break;} for(i=0; i<len && flag; i++){ j = k = 0; while(j<len-1){ if(i==k){k++; continue;} s1[j++] = s[k++]; } s1[j] = '\0'; search(T, s1); } for(i=0; i<len && flag; i++){ strcpy(s1, s); for(j=0; j<26; j++){ s1[i] = j+'a'; search(T, s1); } } for(i=0; i<len+1 && flag; i++){ for(j=0; j<26; j++){ strcpy(s1, s); for(k=len+1; k>i; k--){ s1[k] = s1[k-1]; } s1[k] = j+'a'; search(T, s1); } } qsort(ans, cnt, sizeof(ans[0]), cmp); printf("%s:", s); for(i=0; i<cnt && flag; i++){ if(i != cnt-1 && strcmp(ans[i].s, ans[i+1].s) == 0) continue; else printf(" %s", ans[i].s); } putchar('\n'); } } return 0; }