BZOJ1819 [JSOI]Word Query电子字典 Trie
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1819
题意概括
字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或b变为a,最少“编辑”次数即为距离。
删除串中某个位置的字母;
添加一个字母到串中某个位置;
替换串中某一位置的一个字母为另一个字母;
对于一个待查询字符串,如果它是单词,则返回-1;如果它不是单词,则返回字典中有多少个单词与它的编辑距离为1。
题解
根据输入的单词构建trie,然后大力搜索即可。
dfs,时间复杂度为m*20*20*20可以过去
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=10005,L=20+5;
struct Trie{
int e,Next[26];
void init(){
e=0;
memset(Next,0,sizeof Next);
}
}tree[N*L];
int n,m,ans,trie_cnt,len,addv[N],mark;
char ch[L];
void build(char ch[],int bh){
int rt=1,t,len=strlen(ch);
for (int i=0;i<len;i++){
t=ch[i]-'a';
if (!tree[rt].Next[t])
tree[tree[rt].Next[t]=++trie_cnt].init();
rt=tree[rt].Next[t];
}
tree[rt].e=bh;
}
void init_trie(){
tree[1].init();
trie_cnt=1;
}
bool dfs(int pos,int rt,bool used){
if (pos>=len){
if (!used)
for (int i=0;i<26;i++)
if (tree[rt].Next[i])
if (dfs(pos,tree[rt].Next[i],1))
return 1;
if (tree[rt].e==0)
return 0;
if (!used)
return 1;
if (addv[tree[rt].e]!=mark)
ans++;
addv[tree[rt].e]=mark;
return 0;
}
int t=ch[pos]-'a';
if (used){
if (!tree[rt].Next[t])
return 0;
return dfs(pos+1,tree[rt].Next[t],1);
}
//not used
if (tree[rt].Next[t])
if (dfs(pos+1,tree[rt].Next[t],0))
return 1;
//add & change
for (int i=0;i<26;i++)
if (tree[rt].Next[i]){
int nxt=tree[rt].Next[i];
if (dfs(pos,nxt,1))
return 1;
if (t!=i)
if (dfs(pos+1,nxt,1))
return 1;
}
// delete
if (dfs(pos+1,rt,1))
return 1;
return 0;
}
int main(){
scanf("%d%d",&n,&m);
init_trie();
for (int i=1;i<=n;i++){
scanf("%s",ch);
build(ch,i);
}
memset(addv,0,sizeof addv);
for (int i=1;i<=m;i++){
mark=i;
scanf("%s",ch);
len=strlen(ch);
ans=0;
if (dfs(0,1,0)){
puts("-1");
continue;
}
printf("%d\n",ans);
}
return 0;
}
BZOJ1819 [JSOI]Word Query电子字典 Trie的更多相关文章
- [bzoj1819] [JSOI]Word Query电子字典
正解是trie树...在树上跳来跳去什么的 然而在企鹅qq那题的影响下我写了hash... 添加一个字母到一个串,就相当于另一个串删对应位置上的字母. 改变某个位置上的字母,就相当于两个字符串删掉同一 ...
- 2786: [JSOI]Word Query电子字典
2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Statu ...
- 1819: [JSOI]Word Query电子字典
1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 729 Solved: 238[Submit][S ...
- bzoj 1819: 电子字典 Trie
题目: Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功 ...
- 洛谷P4407 [JSOI2009]电子字典
题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...
- 改变word的语言字典
改变word的语言字典 上周末看论坛有人提出否有方法用代码改变word的语言字典,因为默认的语言会影响现用语言输入的拼写器和其他校对工具.我们的Spire.doc正好支持,正好闲来无事所以我用西班牙语 ...
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- Remember the Word,LA3942(Trie树+DP)
Trie树基础题,记录下代码. #include <cstdio> #include <cstring> #define MaxNode 4005*100 #define No ...
- leetcode 211. Add and Search Word - Data structure design Trie树
题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...
随机推荐
- c# 网络验证
#region 检查网络连接 static bool exitResult = false; /// <summary> /// 检查网络连接 /// add by wlzhang 201 ...
- Java SE之For增强与Iterator遍历器提取数据(附Map.Entry)
增强for循环: 1.操作数组 2.操作List集合 3.操作Map集合 1.map.values()法 2.map.keySet()法 [传统方法] 3.Map.Entry法 ...
- Error while executing topic command : Replication factor: 2 larger than available brokers: 0.
[root@hdp1 /mnt/software/maxwell-1.19.4]#kafka-topics.sh --zookeeper hdp1,hdp2,hdp3:2181 --create -- ...
- SpringBoot在IDEA中实现热部署
gradle构建形式 添加依赖 compile("org.springframework.boot:spring-boot-devtools") 其他设置 步骤1 步骤2 按下 C ...
- Django搭建简易博客教程(四)-Models
原文链接: http://www.jianshu.com/p/dbc4193b4f95 Django Model 每一个Django Model都继承自django.db.models.Model 在 ...
- 用accessKey设置快捷键
<!DOCTYPE html> <html> <body> <a href="http://www.w3school.com.cn/html/&qu ...
- groovy与java中的多方法
最近在学习groovy的时候从书里看到这么一个有趣的例子,刚开始我也猜错了: 最后测试答案是: son ----show 刚开始没理解,以为是num---show,但是后来看书上说是: test01接 ...
- Linux的7个运行级别
0:关机 1:单用户(找回丢失密码)此模式下所有用户不需要密码即可登录,可用于重置密码 2:多用户状态没有网络服务 3:多用户状态有网络服务 ★ 4:系统未使用保留给用户 5:图形界面 ★ 6:系统重 ...
- SpringBoot修改Servlet相关配置
第一种方式在配置文件中进行修改 server.port=8081 server.servlet.context-path=/springboot server.tomcat.uri-encoding= ...
- BN讲解(转载)
本文转载自:http://blog.csdn.net/shuzfan/article/details/50723877 本次所讲的内容为Batch Normalization,简称BN,来源于< ...