题面:洛谷

题解:

  做法。。。。非常暴力。

  因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可,

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 25
#define ac 10100
#define base 26
#define LL long long
#define us unsigned int n, m, len, ans, cnt, dfn;
int id[ac];
us LL hs[ac], qw[AC], ls[AC], rs[AC];
char s[AC]; void build()
{
scanf("%s", s + ), len = strlen(s + ), ++ cnt;
for(R i = ; i <= len; i ++) hs[cnt] = hs[cnt] * base + s[i];
} void pre()
{
scanf("%d%d", &n, &m);
for(R i = ; i <= n; i ++) build();
sort(hs + , hs + n + );
qw[] = ;
for(R i = ; i <= ; i ++) qw[i] = qw[i - ] * base;
} bool half(us LL x)
{
int l = , r = n, mid;
while(l < r)
{
mid = (l + r) >> ;
if(hs[mid] == x)
{
if(id[mid] == dfn) return false;
id[mid] = dfn; return true;
}
else if(hs[mid] < x) l = mid + ;
else r = mid - ;
}
if(hs[l] != x) return false;
if(id[l] == dfn) return false;
id[l] = dfn; return true;
} bool check()
{
scanf("%s", s + ), len = strlen(s + ), ans = , ++ dfn;
us LL x = ;
memset(rs, , sizeof(rs));//why?????大概是因为下面判断的时候可能用到r[len + 1]吧,而r[len + 1]应该要=0的
for(R i = ; i <= len; i ++) x = x * base + s[i];
if(half(x))
{
printf("-1\n");
return true;
}
for(R i = ; i <= len; i ++) ls[i] = ls[i - ] * base + s[i];
for(R i = ; i <= len; i ++) rs[i] = ls[len] - ls[i - ] * qw[len - i + ];
//for(R i = 1; i <= len; i ++) printf("%lld ", rs[i]);
//printf("\n");
return false;
} void get()
{
us LL x;
for(R i = ; i <= len; i ++)//枚举对哪一位进行操作,
{//如果是插入的话就是在这个位置的后面插入
if(i)//只有i > 0才可以删除和修改
{
for(R j = ; j < ; j ++)//枚举修改成哪个
{
x = ls[i - ] * qw[len - i + ] + 1LL * (j + 'a') * qw[len - i] + rs[i + ];
if(half(x)) ans ++;
}
x = ls[i - ] * qw[len - i] + rs[i + ];
if(half(x)) ans ++;
}
for(R j = ; j < ; j ++)//枚举在后面插入哪个
{
x = ls[i] * qw[len - i + ] + 1LL * (j + 'a') * qw[len - i] + rs[i + ];
if(half(x)) ans ++;
}
}
printf("%d\n", ans);
} void work()
{
for(R i = ; i <= m; i ++)
{
if(check()) continue;
get();
}
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}

[JSOI2009]电子字典 hash的更多相关文章

  1. 洛谷P4407 [JSOI2009]电子字典

    题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...

  2. luogu4407 [JSOI2009]电子字典 字符串hash + hash表

    暴力枚举,然后\(hash\)表判断 复杂度\(O(26 * 20 * n)\) 具体而言 对于操作1:暴力枚举删除 对于操作2:暴力添加,注意添加不要重复 对于操作3:暴力替换,同样的注意不要重复 ...

  3. P4407 [JSOI2009]电子字典

    传送门 我的哈希打挂了--然而大佬似乎用哈希可以过还跑得很快-- 删除,枚举删哪个字符,记删之后的哈希值存map 插入,相当于在单词里删字符,去对应的map里查找 更改,相当于两个都删掉同一个位置的字 ...

  4. 2786: [JSOI]Word Query电子字典

    2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 3[Submit][Statu ...

  5. 1819: [JSOI]Word Query电子字典

    1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 729  Solved: 238[Submit][S ...

  6. bzoj 1819: 电子字典 Trie

    题目: Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功 ...

  7. 字典 hash

    字典是按照hash存的,他会映射一个hash表,所以查找的时候根据一些算法会很快: 参考: https://harveyqing.gitbooks.io/python-read-and-write/c ...

  8. [bzoj1819] [JSOI]Word Query电子字典

    正解是trie树...在树上跳来跳去什么的 然而在企鹅qq那题的影响下我写了hash... 添加一个字母到一个串,就相当于另一个串删对应位置上的字母. 改变某个位置上的字母,就相当于两个字符串删掉同一 ...

  9. BZOJ1819 [JSOI]Word Query电子字典 Trie

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1819 题意概括 字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或 ...

随机推荐

  1. Repo 的使用小结

    一.安装 创建目录和修改环境变量 $ mkdir ~/bin $ PATH=~/bin:$PATH 下载repo代码 $ curl https://storage.googleapis.com/git ...

  2. 解决 mysql in 查询排序问题

    select id,title from za_item where -- id ,) 返回的结果第一条是对应id是1000,第二条是1003. 如果我们想让结果和in里面的排序一致,可以这么做. s ...

  3. 存一下emacs配置

    (global-set-key [f9] 'compile-file)(global-set-key [f10] 'gud-gdb)(global-set-key (kbd "C-z&quo ...

  4. Struts 2(一):初识Struts

    [很久以前的笔记,后续继续完善] 在了解Struts 2框架之前,首先了解一下Model 1和Model 2架构,以及它们的优缺点. 1.1 Model 1架构模式 Model 1的核心是JSP文件, ...

  5. Charles连接苹果及JSON乱码情况解决

    1.  Charles的JSON乱码情况解决: 点击Charles界面上的help—SSL proxying—install Charles Root Certificate,将证书安装到[受信任的根 ...

  6. Oracle同义词和序列

    同义词:是表.索引.视图的模式对象的一个别名,通过模式对象创建同意词,可以隐藏对象的实际名称和 所有者信息,为对象提供一定的安全性,开发应用程序时:应该尽量避免直接使用表,视图 或其他对象,改用对象的 ...

  7. 树形dp入门两题

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  8. Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法

    Linux系统中,进程之间有一个明显的继承关系,所有进程都是 PID 为1的 init 进程的后代.内核在系统启动的最后阶段启动 init 进程.该进程读取系统的初始化脚本(initscript)并执 ...

  9. JAVA学习笔记--数组初始化

    JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...

  10. Linux下文件的打包、解压缩指令——tar,gzip,bzip2

    本文是对 鸟叔的Linux私房菜(基础学习篇) 第三版 的学习笔记,原文可参考原书中文网站 鸟叔的Linux私房菜.更多详细信息可直接参考对应Linux命令的 man 帮助( 如 man tar). ...