2786: [JSOI]Word Query电子字典

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3  Solved: 3
[Submit][Status][Web Board]

Description

人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间。带有模糊查询功能的电子字典能够从一定程度上解决这一问题:用户只要输入一个字符串,电子字典就返回与该单词编辑距离最小的几个单词供用户选择。字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或b变为a,最少“编辑”次数即为距离。 删除串中某个位置的字母; 添加一个字母到串中某个位置; 替换串中某一位置的一个字母为另一个字母; JSOI团队正在开发一款电子字典,你需要帮助团队实现一个用于模糊查询功能的计数部件:对于一个待查询字符串,如果它是单词,则返回-1;如果它不是单词,则返回字典中有多少个单词与它的编辑距离为1。

Input

第一行包含两个正整数N (N < = 10,000)和M (M < = 10,000)。接下来的N行,每行一个字符串,第i + 1行为单词Wi。单词长度在1至20之间。再接下来M行,每行一个字符串,第i + N + 1表示一个待查字符串Qi。待查字符串长度在1至20之间。Wi和Qi均由小写字母构成,文件中不包含多余空格。所有单词互不相同,但是查询字符串可能有重复。

Output

输出应包括M行,第i行为一个整数Xi。Xi = -1表示Qi为字典中的单词;否则Xi表示与Qi编辑距离为1的单词的个数。

Sample Input

4 3
abcd
abcde
aabc
abced
abcd
abc
abcdd

Sample Output

-1
2
3
//abcd在单词表中出现过;abc与单词abcd、aabc的编辑距离都是1;abcdd与单词abcd、abcde、abced的编辑距离都是1。

HINT

 

Source

题解:

  trie树+dfs乱搞出奇迹。。。。。。

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#define maxn 200010
using namespace std;
int n,m,ans,len,top,tot;
int fail[maxn],sum[maxn],lis[maxn],son[maxn][];
bool bo;
bool vis[maxn];
char s[maxn];
void insert()
{
scanf("%s",s+); int p=;
for (int i=; s[i]; p=son[p][s[i]-'a'],i++)
if (!son[p][s[i]-'a']) son[p][s[i]-'a']=++tot;
sum[p]=;
}
void dfs(int x,int y, int z)
{
if (x==len && sum[y] && !z) {bo=false; return; }
if (x==len && sum[y] && z) { if (!vis[y]) {vis[y]=; lis[++top]=y; ans++;}return;}
if (x<len && !z) dfs(x+,y,);//加单词
if (!z)
{
for (int i=; i<; i++)
if (son[y][i]) { dfs(x,son[y][i],); if (i!=s[x+]-'a') dfs(x+,son[y][i],);}
}
//if (x==len) return ;
if (son[y][s[x+]-'a']) dfs(x+,son[y][s[x+]-'a'],z); }
void work()
{
while (top) vis[lis[top--]]=; scanf("%s",s+); len=strlen(s+); ans=; bo=true;
dfs(,,);
if (bo==false) printf("-1\n"); else printf("%d\n",ans);
}
int main()
{
cin>>n>>m; top=tot=;
memset(vis,false,sizeof(vis));
for (int i=; i<=n; i++) insert();
for (int i=; i<=m; i++) work();
}

最新文章

  1. logback 配置详解(二)——appender
  2. php开发中怎么获取服务端MAC地址?
  3. win7(64)位下WinDbg64调试VMware10下的win7(32位)
  4. 实现SVN与WEB同步解决方案(转)
  5. 通过 Azure 媒体管理门户开始使用直播流媒体
  6. TOMCAT之性能跟踪入门
  7. WinForm 国际化开发一例
  8. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充
  9. 极化码的matlab仿真(1)——参数设置
  10. 持续交付Jenkins使用
  11. USACO2004 Open提交作业(区间DP)
  12. IDEA 格式化代码快捷键冲突解决
  13. Markdown学习示例
  14. Linux中VIM的使用
  15. springcloud Zuul学习笔记
  16. 071 HBase的安装部署以及简单使用
  17. [BigData - Hadoop - YARN] YARN:下一代 Hadoop 计算平台
  18. LeetCode 题解之 Positions of Large Groups
  19. JDK自带线程池介绍及使用环境
  20. Clojure学习之defmulti

热门文章

  1. JavaBean--实例:注册验证
  2. 基于JAVA语言的多线程技术
  3. C#入门经典第八章面向对象编程简介-1
  4. 关于MySql中自增长id设置初始值
  5. apache服务器中设置目录不可访问
  6. NOIP模拟赛---1.生气的LJJ (anger)
  7. Android Studio:Gradle DSL method not found: &#39;runProguard()&#39;
  8. The Willpower Instinct
  9. [JSP] c:forEach 如何输出序号 - luotangsha的专栏 - 博客频道 - CSDN.NET
  10. List的输出方法