题面:洛谷

题解:

  做法。。。。非常暴力。

  因为要求的编辑距离最多只有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. Angular ng-include 学习实例

    ng-include 可以引入外部的文件到当前视图中.这样可以增强复用性. 最简单的用法  <div ng-include src="'/public/template/tpl.htm ...

  2. 转:后台管理UI的选择

    注:文中缺少了ZUI和LAYUI两个. 目录 一.EasyUI 二.DWZ JUI 三.HUI 四.BUI 五.Ace Admin 六.Metronic 七.H+ UI 八.Admin LTE 九.I ...

  3. RestQL:现代化的 API 开发方式

    参考:https://tech.meituan.com/koa-restql.html 在现代的业务系统中,后端开发工作基本上可以被拆分为三项: 接口鉴权.例如判断是不是当前系统的用户,以及该用户是否 ...

  4. C# webapi 路由规则和接收数据

    1:新建的web api项目 默认的访问api方式:  (get,post,delect,put)  api+控制器  以Post为例子 post提交单个参数: 接收方法  post提交多个参数  接 ...

  5. java class file

    目录 什么是java类文件 幻数 主次版本号 常量池数和常量池 this_class super_class 接口数量和接口 字段数和字段 方法数和方法 以下内容主要还是参考<Inside JV ...

  6. eclipse集成testng插件(离线安装方式)

    testng是一个优秀的测试框架,我们在开发自动化测试脚本或者框架的时候经常会用到这个框架,因为它不仅能方便的帮助我们管理测试类,而且它还提供了丰富的注解来支持各种测试场景的实现(参数化,数据提供者, ...

  7. centos 7 install gnome etc

    centos yum 有grouplist子命令,可以查看当前系统有多少软件组件,里面就有gnome:"GNOME Desktop" sudo yum groupinstall G ...

  8. mongodb4简明笔记

    就一数据库,掌握基本用法,其他的现学现卖就行了. 所以要把握基本套路. 创建数据库=>使用数据库=>创建集合=>使用集合=>创建文档=>使用文档 1.数据库 mongod ...

  9. ES6的新特性(2)——let 与 const 增强变量声明

    let 与 const 增强变量声明 ES6 新增了let命令,用来声明局部变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束. 先看个var的常见 ...

  10. SVN服务器搭建及客户端配置

    为什么要使用SVN? 在程序的编写过程中,每个程序员都会负责开发一个或多个模块,且开发中会生成很多不同的版本, 这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subvers ...