标签:
将单词建立trie,对每个查询若不是单词则构造与其编辑距离为1的所有字符串并在trie查询。
由于编辑距离为1的串可能重复,一个单词可能匹配到多次,注意判重。
查询时间复杂度O(查询串总长度*26)
#include<cstdio> #include<cstring> int n,m; char s[32],s1[32]; int nx[200005][26],p=2; bool e[200005]; int d[200005],now=1; void insert(char*s){ int w=0,c; while(*s){ c=*s-‘a‘; if(nx[w][c])w=nx[w][c]; else w=nx[w][c]=p++; s++; } e[w]=1; } int find(char*s){ int w=0,c; while(*s){ c=*s-‘a‘; if(nx[w][c])w=nx[w][c]; else return 0; s++; } if(e[w]&&d[w]!=now){ d[w]=now; return 1; } return 0; } int main(){ scanf("%d%d",&n,&m); while(n--){ scanf("%s",s); insert(s); } while(m--){ now++; scanf("%s",s); if(find(s))puts("-1"); else{ int l=strlen(s),ans=0; for(int i=0;i<l;i++){ char c=s[i]; for(char a=‘a‘;a<=‘z‘;a++){ s[i]=a; if(a!=c)ans+=find(s); } s[i]=c; } for(int i=1;i<l;i++)s1[i-1]=s[i];s1[l-1]=0; ans+=find(s1); for(int i=1;i<l;i++){ s1[i-1]=s[i-1]; ans+=find(s1); } for(int i=0;i<l;i++)s1[i+1]=s[i];s1[l+1]=0; for(int i=0;i<=l;i++){ for(char a=‘a‘;a<=‘z‘;a++){ s1[i]=a; ans+=find(s1); } s1[i]=s1[i+1]; } printf("%d\n",ans); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/ccz181078/p/5223356.html