思路:
对于每次询问,暴力枚举所有编辑距离为1的串,然后用Trie判断存不存在并判重.
妈呀这是\(O(10000*26*20*20)=10^8\),居然也能过.
其实用Hash感觉就好多了.
有没有更好的方法?目前没想出来.
#include<cstdio> #include<cstring> #include<cctype> #include<climits> #include<iostream> #include<algorithm> using namespace std; int ch[200010][26],end[200010],vis[200010],cnt; char s[21],ss[22]; int tclock; inline bool judge(int len){ int p=0; for(int i=0;i<len;++i){ if(!ch[p][ss[i]-'a'])return 0; p=ch[p][ss[i]-'a']; } if(!end[p])return 0; if(vis[p]!=tclock)return vis[p]=tclock,1;else return 0; } int main(){ int n,m;scanf("%d%d",&n,&m); register int i,j,k; int len,p,y; while(n--){ scanf("%s",s); len=strlen(s),p=0; for(i=0;i<len;++i){ y=s[i]-'a'; if(!ch[p][y])ch[p][y]=++cnt; p=ch[p][y]; } end[p]=1; } int id; while(m--){ scanf("%s",s); len=strlen(s); p=0; bool find=1; for(i=0;i<len;++i){ y=s[i]-'a'; if(!ch[p][y]){find=0;break;} else p=ch[p][y]; } if(find&&end[p]){puts("-1");continue;} int re=0; ++tclock; if(len>1){ for(i=0;i<len;++i){ id=0; for(j=0;j<i;++j)ss[id++]=s[j]; for(j=i+1;j<len;++j)ss[id++]=s[j]; re+=judge(len-1); } } for(i=0;i<len;++i)for(j=0;j<26;++j)if(j!=s[i]-'a'){ memcpy(ss,s,sizeof s),ss[i]='a'+j; re+=judge(len); } for(i=0;i<=len;++i)for(j=0;j<26;++j){ id=0; for(k=0;k<i;++k)ss[id++]=s[k]; ss[id++]='a'+j; for(k=i;k<len;++k)ss[id++]=s[k]; re+=judge(len+1); } printf("%d\n",re); } return 0; }