打cf的时候遇到的问题,clairs告诉我这是POI2012 的原题..原谅我菜没写过..于是拐过来写这道题并且学了下string hash.   字符串hash基于Rabin-Karp算法,并且对于各种长度子串的匹配是常数的.具体做法看代码就明白了.然后如果单hash没发过.那就试试双hash把.如果还不行那就三hash以此类推..一般到双hash就基本不会出错.你的hash的mod值要尽量分开和是素数就对了. 这种方法实在是神,当数据过大时才会可能出错2333很适合竞赛. 附加一个类似双ha…
题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满足下面条件的最大的L: \(L\le \frac n 2\) S的L前缀和S的L后缀是循环相同的. \(n\le 1,000,000\) 分析 题意相当于找一段前缀=后缀(1) 删掉这两段后再找一段前缀=后缀(2) 长度和就是答案了 其中(1)部分随便搞\(O(n)\) \(hsh\)扫过去就好了…
...字符串hash. 假如长度x是一个循环节, 那么对于任意n(x | n)也是一个循环节. 设当前询问区间[l, r]长度为len = ∏piai, 最终答案ans = ∏piai' ,我们只需枚举len的质因数来确定ai'即可 #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int maxn = 500009; const ull P = 1000173169; char…
简单介绍一下字符串hash 相信大家对于hash都不陌生 翻译过来就是搞砸,乱搞的意思嘛 hash算法广泛应用于计算机的各类领域,像什么md5,文件效验,磁力链接 等等都会用到hash算法 在信息学奥赛中,hash算法主要应用于搜索状态判重,字符串的比较等 hash的主要思想是:对于一个空间.时间需求较大的状态,在一定错误率的基础上进行状态压缩,降低其时间.空间的需求量 对于字符串hash来说,就是把一串字符串压缩成一个hash值,方便我们进行数据的处理 接下来我们重点讲一下字符串hash的实现…
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 640  Solved: 322[Submit][Status][Discuss] Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. Input 第一行一个正整数n (n<=500,000),表示S的长度.第二行n个小…
题目大意 bzoj 2795 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节. 如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. n<=500,000 , q<=2,000,000 分析 判循环节用hash \(O(q\sqrt n)\)枚举因子? TLE 注意一个特殊的性质 若长度len可为循环节,则若(klen) | n,(klen)也为循环节 不会出现两个循环节长度互质除非1是循环节 由于已知整个串是循环节 于是我们可以枚举质因子判断循…
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词典.当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能:当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒.如果他要的魔咒不在词典中,就输出“what?” Input 首先列出词典中不超过100000条不同的魔咒词条,每条格式为: [魔…
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][Status][Discuss] Description 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的.给出一个长度为n的串S,求满足下面条件的最大的L:1. L<=n/22. S的L前缀和S的L后缀是循环相同…
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上,后两次反面朝上. 选出n个同学,每个同学猜一个长度为m的序列,当某一个同学猜的序列在硬币序列中出现时(匹配时的序列必须连续),就不再扔硬币了,并且这个同学胜利.猜的n个序列两两不同. 假设硬币正反面朝上的概率相同,求每个同学胜利的概率. \(n \leq 300\) 分析 (注意,本题中不区分序列和…
题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<algorithm> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #defi…