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 ...
随机推荐
- vue+hbuilder监听安卓返回键问题
1.监听安卓返回键问题 效果:在一级页面按一下返回键提示退出应用,按两下退出应用;在其它页面中,按一下返回上个历史页面 1 2 import mui from './assets/js/mui.min ...
- qt中int与string的相互转换
我经常搞错这个问题,一直以为整形int b可以直接使用函数toString呢! 但是在qtCreator中在整形后面不管怎么按点(可以自动提示)他就是不给我提示,我就纳闷了这样居然不行 百度了之后才知 ...
- 事件,使用.net自带委托EventHandler
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- re-sign重签名
准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 从D:\Android\sdk\build-tools\ ...
- python网络编程--线程Semaphore(信号量)
一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...
- 网络协议之TCP
前言 近年来,随着信息技术的不断发展,各行各业也掀起了信息化浪潮,为了留住用户和吸引用户,各个企业力求为用户提供更好的信息服务,这也导致WEB性能优化成为了一个热点.据分析,网站速度越快,用户的黏性. ...
- H5新特性:video与audio的使用
HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaScript 来操作 <audio> ...
- Kafka ACL使用实战(单机版)
一.简介 自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密( ...
- Django项目流程
创建项目和应用 django-admin.py startproject project_name cd project_name python manage.py startapp app_name ...
- 实战MEF(1)一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...