3098: Hash Killer II

Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 1555  Solved: 819
[Submit][Status][Discuss]

Description

这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:
给你一个长度为N的字符串S,求有多少个不同的长度为L的子串。
子串的定义是S[l]、S[l + 1]、... S[r]这样连续的一段。
两个字符串被认为是不同的当且仅当某个位置上的字符不同。

VFleaKing一看觉得这不是Hash的裸题么!于是果断写了哈希 + 排序。
而hzhwcmhf神犇心里自然知道,这题就是后缀数组的height中 < L的个数 + 1,就是后缀自动机上代表的长度区间包含L的结点个数,就是后缀树深度为L的结点的数量。
但是hzhwcmhf神犇看了看VFleaKing的做法表示非常汗。于是想卡掉他。

VFleaKing使用的是字典序哈希,其代码大致如下:
u64 val = 0;
for (int i = 0; i < l; i++)
 val = (val * base + s[i] - 'a') % Mod;
u64是无符号int64,范围是[0, 2^64)。
base是一个常量,VFleaKing会根据心情决定其值。
Mod等于1000000007。
VFleaKing还求出来了base ^ l % Mod,即base的l次方除以Mod的余数,这样就能方便地求出所有长度为L的子串的哈希值。
然后VFleaKing给哈希值排序,去重,求出有多少个不同的哈希值,把这个数作为结果。
其算法的C++代码如下:

typedef unsigned long long u64;

const int MaxN = 100000;

inline int hash_handle(const char *s, const int &n, const int &l, const int &base)
{
 const int Mod = 1000000007;

u64 hash_pow_l = 1;
 for (int i = 1; i <= l; i++)
  hash_pow_l = (hash_pow_l * base) % Mod;

int li_n = 0;
 static int li[MaxN];

u64 val = 0;
 for (int i = 0; i < l; i++)
  val = (val * base + s[i] - 'a') % Mod;
 li[li_n++] = val;
 for (int i = l; i < n; i++)
 {
  val = (val * base + s[i] - 'a') % Mod;
  val = (val + Mod - ((s[i - l] - 'a') * hash_pow_l) % Mod) % Mod;
  li[li_n++] = val;
 }

sort(li, li + li_n);
 li_n = unique(li, li + li_n) - li;
 return li_n;
}

hzhwcmhf当然知道怎么卡啦!但是他想考考你。

Input

没有输入。

Output

你需要输出一组数据使得VFleaKing的代码WA掉。我们会使用Special Judge检查你的结果的正确性。
第一行两个用空格隔开的数n、l。
第二行是一个长度为n的字符串。只能包含'a'~'z'。
需要保证1 <= n <= 10^5, 1 <= l <= n,
不符合以上格式会WA。
不要有多余字符,很可能导致你WA。

Sample Input

没有

Sample Output

8 4
buaabuaa
(当然这个输出是会WA的)

HINT

如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。

Source

VFleaKing & hzhwcmhf

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3098

分析:

如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。

生日攻击:如果你在n个数中随机选数,那么最多选√n次就能选到相同的数(不考虑Rp broken)

同样的,这题的Hash值在0到1000000007.那就要选差不多10^5次

唯一注意的是l要取大,使得方案数超过Mod,否则就不可能有2个数有相同的Hash值

下面给出AC代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 using namespace std;
 4 int main()
 5 {
 6     int n=100000,l=20;
 7     printf("%d %d\n",n,l);
 8     for (int i=1;i<=n;i++)
 9       printf("%c",(char)(rand()%26+'a'));
10     printf("\n");
11     return 0;
12 } 

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/6914441.html

BZOJ 3098: Hash Killer II(新生必做的水题)相关推荐

  1. 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2709  Solved: 1726 [Submi ...

  2. BZOJ 3098(Hash Killer II-生日攻击)

    3098: Hash Killer II Time Limit: 5 Sec   Memory Limit: 128 MBSec   Special Judge Submit: 66   Solved ...

  3. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

    BZOJ 3097: Hash Killer I[构造题,思维题] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097 题意:让你出一组 ...

  4. 【BZOJ 3098】 Hash Killer II

    Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给你一个长度为N的字符串S,求有多少个不同的长度为L的子串. 子串的定义是S[l].S[l + 1].... ...

  5. BZOJ3098. Hash Killer II(生日攻击)

    Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给你一个长度为N的字符串S,求有多少个不同的长度为L的子串. 子串的定义是S[l].S[l + 1].- S ...

  6. MySQL一般读作什么_MySQL入门必做练习题50题(一) 创建表

    练习题介绍: 对于一个学校信息管理系统中的数据库,有如下4张表: 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程 ...

  7. 情侣必做的100件小事,提升幸福感,快收藏

    情侣必做的100件小事,极大提升幸福感: 1.一起散步2.一起看电影3.一起过生日4.一起旅行5.一起看日出6.一起看日落7.一起爬山8.一起看海9.一起游泳10.一起跨年11.一起拍照12.一起滑冰 ...

  8. 安装Ubuntu13.10后必做的10件事

    Ubuntu 13.10发布了,而且你已经升级了,然后你想知道现在要做些什么.不要着急,这里有10件安装完Ubuntu 13.10后必做的事. 我们以前为ubuntu每个版本整理了一个安装后核对表,但 ...

  9. 【一个好的总经理必做的四件事】

    [一个好的总经理必做的四件事] 1.紧盯目标.分解目标到月.到部门.到具体人并且紧盯着: 2.紧盯架构.找到合适的人放到适合目标的架构里: 3.知识积累.最好的经验来自团队,组织总结和提炼,打造可以复 ...

最新文章

  1. http://www.fastweb.cc
  2. java linux urlencode_java字符编码转换研究(转)
  3. c语言朋友,[原创]写给初学 c语言的朋友
  4. 六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离
  5. 统计一个字符在另一个字符串中出现的次数
  6. 【Arthas】Arthas 导出堆栈信息
  7. php中ini set,php ini_set函数的用法
  8. 深度学习中的数据增强方法
  9. [论文笔记]QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION
  10. mathematica打包java_使用Mathematica将解决方案绘制到方程式中
  11. 鸿蒙超级终端使用教程,超级终端怎么用(超级终端使用配置教程)
  12. css border流光效果
  13. HDU4889 Scary Path Finding Algorithm
  14. Zynga和StarLark庆祝《Golf Rival》面世四周年
  15. 汽车HiL测试简单介绍及其优势
  16. CAN 总线的常用拓扑
  17. 备份数据库 并发送到邮箱
  18. 导航栏的使用(ToolBar、BottomNavgationView)
  19. 【UV打印机】电气之光电传感器
  20. 电磁场常见名词整理(不断更新中)

热门文章

  1. linux下mysql常用命令_linux 下 mysql 常用命令
  2. Java执行jar总结
  3. AcWing提高算法课Level-3 第六章 基础算法
  4. 之前出的一道背包题面,暂无题解
  5. 【OpenJudge7826】分苹果(小学奥数)
  6. sudoers修改_为用户增加sudo权限(修改sudoers文件) | 学步园
  7. 自动生成html_服务搭建篇二·Jenkins+Jmeter+Gitlab持续集成实现接口流程自动化
  8. 快速排序 与 归并排序
  9. Python入门--特殊方法__len__(),__add()__
  10. poj 1651区间dp