luogu4407 [JSOI2009]电子字典 字符串hash + hash表
暴力枚举,然后\(hash\)表判断
复杂度\(O(26 * 20 * n)\)
具体而言
对于操作1:暴力枚举删除
对于操作2:暴力添加,注意添加不要重复
对于操作3:暴力替换,同样的注意不要重复
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ri register int
#define ull unsigned long long
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
const int yume = 19260817;
const int sid = 4300050;
char s[50];
int n, m, L, cnp;
ull num, pre[50], wei[50];
int cap[sid], nxt[sid], val[sid];
ull fz[sid];
inline int get(ull v) {
int k = v & 4194303;
for(int i = cap[k]; i; i = nxt[i])
if(fz[i] == v) return i;
return 0;
}
inline void ins(ull v) {
int k = v & 4194303;
int p = get(v);
if(!p) {
nxt[++ cnp] = cap[k]; fz[cnp] = v;
cap[k] = cnp; val[cnp] = 1;
}
else val[p] ++;
}
inline ull v(int l, int r) {
if(l > r) return 0;
return pre[r] - pre[l - 1] * wei[r - l + 1];
}
inline ull calc1(int p) { return v(1, p - 1) * wei[L - p] + v(p + 1, L); }
inline ull calc2(int p, char c) { return v(1, p - 1) * wei[L - p + 1] + v(p + 1, L) + c * wei[L - p]; }
inline ull calc3(int p, char c) { return v(1, p) * wei[L - p + 1] + v(p + 1, L) + c * wei[L - p]; }
int main() {
wei[0] = 1;
rep(i, 1, 30) wei[i] = wei[i - 1] * yume;
cin >> n >> m;
rep(i, 1, n) {
scanf("%s", s + 1); L = strlen(s + 1); num = 0;
rep(j, 1, L) num = num * yume + s[j];
ins(num);
}
rep(i, 1, m) {
scanf("%s", s + 1); L = strlen(s + 1);
rep(j, 1, L) pre[j] = pre[j - 1] * yume + s[j];
if(get(pre[L])) { printf("-1\n"); continue; }
int ans = 0;
rep(j, 1, L)
if(s[j] != s[j - 1])
ans += val[get(calc1(j))];
rep(j, 1, L) rep(c, 'a', 'z')
if(c != s[j])
ans += val[get(calc2(j, c))];
rep(j, 0, L) rep(c, 'a', 'z')
if(c != s[j + 1])
ans += val[get(calc3(j, c))];
printf("%d\n", ans);
}
return 0;
}
luogu4407 [JSOI2009]电子字典 字符串hash + hash表的更多相关文章
- 洛谷P4407 [JSOI2009]电子字典
题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...
- [JSOI2009]电子字典 hash
题面:洛谷 题解: 做法....非常暴力. 因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可, #in ...
- P4407 [JSOI2009]电子字典
传送门 我的哈希打挂了--然而大佬似乎用哈希可以过还跑得很快-- 删除,枚举删哪个字符,记删之后的哈希值存map 插入,相当于在单词里删字符,去对应的map里查找 更改,相当于两个都删掉同一个位置的字 ...
- redis 2 字符串 和 hash
string是最简单的类型,一个key对应一个value,string类型是二进制安全的.redis的string可以包含任何数据,比如JPG图片或者序列化的对象 操作 set 设置key ...
- 数据结构之哈希(hash)表
最近看PHP数组底层结构,用到了哈希表,所以还是老老实实回去看结构,在这里去总结一下. 1.哈希表的定义 这里先说一下哈希(hash)表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过 ...
- redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快
前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...
- mycat1.6.5分片(字符串拆分hash)
https://blog.csdn.net/webnum/article/details/78313525 分片规则:字符串拆分hash 一.conf/schema.xml文件 <?xm ...
- Linux命令之Hash缓存表
Hash缓存表 系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将 ...
- 字符串转hash进阶版
#include<bits/stdc++.h> using namespace std; ,mod=; vector<unsigned> H[mod]; void Add(un ...
随机推荐
- zTree静态树与动态树的用法——(七)
0.[简介] zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实 ...
- Css中实现一个盒子固定宽度,另一个盒子宽度自适应的方法
Css中实现一个盒子固定宽度,另一个盒子宽度自适应的方法 网上方法很多,个人认为以下两种思想是最为常用的. 一种是让第一个盒子脱离文档流,第二个盒子离左边有一定距离. 第二种方法是使用flex布局,不 ...
- ubuntu网络连接:Ifupdown(eth0)的连接不能修改或删除
今天其实遇到了三个问题,一个是ubuntu系统上的网络图标不见了,把网络图标弄出来以后有无法联网,联网成功却变成Ifupdown(eth0)的连接且不能修改或删除. 这里我只记录最后一个问题,前两个问 ...
- 诺贝斯特(厦门)电气有限公司http://www.thebest.cn.com/
诺贝斯特(厦门)电气有限公司,公司位于厦门市湖里区塘边社168号.是一家专注于智能电网用户端智能配用电以及电气安全产品研发.生产和销售的高新技术企业:致力于为工矿企业.建筑楼宇以及基础设施等智能电网用 ...
- ubuntu使用百度云盘插件
Firefox 插件地址 https://addons.mozilla.org/zh-CN/firefox/addon/baidu-pan-exporter/ 安装后重启Firefox,然后百度云下载 ...
- nfs挂载出错:mount.nfs: access denied by server while mounting
这个问题就是服务器不允许客户端去挂载,那么修改服务端的权限 $ sudo vi /etc/hosts.deny 文本末添加 ### NFS DAEMONS portmap: ALL lockd: AL ...
- SQL-如果指定值存在返回1,如果不存在返回0的SQL语句
想实现简单的判断一个表中是否有一条记录,可以用这个方式.如以下,table_name是表名,column1是列名. 这条语句会在此条记录存在的时候返回1,不存在时返回0. FROM table_nam ...
- Python字符串(Str)详解
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可 字符串的格式 b = "hello itcast. ...
- js自定义鼠标右键菜单
document.oncontextmenu = function(e) { return false; } document.onmousedown = function(e) { switch(e ...
- GLOBAL_NAMES参数研究
最近在配置Stream时,发现必须要把GLOBAL_NAMES参数的指设置为TRUE,具体原因为何不知.但是发现在设置了该参数之后,数据库每天的物化视图刷新出现了问题.之后查明原因,是DBLINK出现 ...