传送门

我的哈希打挂了……然而大佬似乎用哈希可以过还跑得很快……

删除,枚举删哪个字符,记删之后的哈希值存map

插入,相当于在单词里删字符,去对应的map里查找

更改,相当于两个都删掉同一个位置的字符然后相等

//minamoto
#include<bits/stdc++.h>
#define rint register int
#define ull unsigned long long
using namespace std;
const int N=25;
int n,m,len,ans,top;char s[N];
ull Base=233,l[N],r[N],bin[N],h[N];
map<ull,ull>a[N],b[N][N],c[N];
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
bin[0]=1;for(rint i=1;i<25;++i)bin[i]=bin[i-1]*Base;
while(n--){
scanf("%s",s+1),len=strlen(s+1);
for(rint j=0;j<25;++j)l[j]=r[j]=h[j]=0;
for(rint j=1;j<=len;++j)l[j]=l[j-1]*Base+s[j]-'a'+1;
for(rint j=len;j;--j)r[j]=r[j+1]+(s[j]-'a'+1)*bin[len-j];
++a[len][l[len]];
for(rint j=1;j<=len;++j)
h[j]=l[j-1]*bin[len-j]+r[j+1],++b[len-1][j][h[j]];
sort(h+1,h+1+len);
for(rint j=1;j<=len;++j)if(h[j]!=h[j-1])++c[len-1][h[j]];
}
while(m--){
scanf("%s",s+1),len=strlen(s+1);
for(rint j=0;j<25;++j)l[j]=r[j]=h[j]=0;
for(rint j=1;j<=len;++j)l[j]=l[j-1]*Base+s[j]-'a'+1;
for(rint j=len;j;--j)r[j]=r[j+1]+(s[j]-'a'+1)*bin[len-j];
if(a[len][l[len]]){puts("-1");continue;}
ans=0;
for(rint j=1;j<=len;++j)h[j]=l[j-1]*bin[len-j]+r[j+1];
for(rint j=1;j<=len;++j)ans+=b[len-1][j][h[j]];
sort(h+1,h+1+len);
for(rint j=1;j<=len;++j)if(h[j]!=h[j-1])ans+=a[len-1][h[j]];
ans+=c[len][l[len]];printf("%d\n",ans);
}return 0;
}

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

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

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

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

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

  3. [JSOI2009]电子字典 hash

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

  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. BZOJ1819 [JSOI]Word Query电子字典 Trie

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

  8. 6.C语言文件操作之英语电子字典的实现,dos版

    多的不说,直接上代码: 里面涉及的字典文件在这:这是传送门,下载下来以后把该文件放在工程目录下即可 #define _CRT_SECURE_NO_WARNINGS #include <stdio ...

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

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

随机推荐

  1. 11servlet接口

    11.servlet接口-2018/07/23 1.servlet 是一个接口,需要导包javax.servlet.Servlet; 第一种编写一个servlet程序的方法 写一个Java类,实现se ...

  2. HDU - 6264 - Super-palindrome(思维)

    题意: 给出一个字符串,使得所有的奇数连续子串为回文串,输出最小变化次数 思路: 分析过后,只存在两种情况,1全部为一种字母,2形如abab交替类型 对于奇数位和偶数位单独计数,只需计算出奇数位或者偶 ...

  3. <MySQL>入门二 增删改 DML

    -- DML语言 /* 数据操作的语言 插入:insert 修改:update 删除:delete */ 1.插入 -- 插入语句 /* 语法:insert into 表名(列名...) values ...

  4. 杂文Python

    2.文件操作 文件操作的过程:打开文件获得句柄——>操作文件行(遍历等)——>关闭文件 打开文件获得句柄 比较low的方法: f = open("file_path", ...

  5. OpenCV+Python识别车牌和字符分割的实现

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  6. FZU 1492 地震预测(模拟链表的应用)(Java实现)

    FZU 1492 地震预测(模拟链表的应用)(Java实现) 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一 ...

  7. PAT 1138 Postorder Traversal

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  8. saltstack(七)返回值

    一.自定义创建模块 在base目录下创建_modules目录,你自己编写的模块都可以存放在该目录下,当前目录结构下: 1 2 3 4 5 6 7 8 [root@localhost:]# tree - ...

  9. ViewService

    ViewService 在分布式系统中,最常见的场景就是主备架构.但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题.本文描述了一种简单的模型用于解决此问题. 背景 ...

  10. IDA 宏定义

    /* This file contains definitions used by the Hex-Rays decompiler output. It has type definitions an ...