rolling hash
也是需要查看,然后修改,rolling hash, recursive hash, polynomial hash, double hash.如果一次不够,那就2次。需要在准备一个线段树,基本的线段树容易些,带lazy标记的区间修改的线段树不是很好写。hash seed key根据需要选择, 我看别人写的,可以写成一个随机数,每次随机选择一个素数作为种子,这样好像好一些。
#include<bits/stdc++.h>
#define pb push_back
#define FOR(i, n) for (int i = 0; i < (int)n; ++i)
#define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl
typedef long long ll;
using namespace std;
typedef pair<int, int> pii;
const int maxn = 1e6 + ;
const int mod1 = 1e9 + ;
const int mod2 = 1e9 + ;
const int arg1 = ;
const int arg2 = ;
int n, k;
string str;
pii H[maxn];
map<pii, int> has[maxn];
map<pii, int> g;
int pw1, pw2;
bool check(map<pii, int> & m) {
for (auto it = m.begin(); it != m.end(); it++) {
if(it->second > ) return ;
else if(g.find(it->first) == g.end()) return false;
}
return ;
}
void solve() {
cin >> n >> k;
cin >> str;
pw1 = pw2 = ;
for (int i = ; i < k - ; i++) {
pw1 = ll(pw1) * arg1 % mod1;
pw2 = ll(pw2) * arg2 % mod2;
}
pii h = pii(, );
for (int i = ; i < k; i++) {
h.first = (ll(h.first) * arg1 + ll(str[i] - 'a' + )) % mod1;
h.second = (ll(h.second) * arg2 + ll(str[i] - 'a' + )) % mod2;
}
H[] = h;
has[][h]++;
for (int i = ; i < n * k; i++) {
h.first = (ll(h.first) - ll(str[i - ] - 'a' + ) * pw1 % mod1 + mod1) % mod1;
h.second = (ll(h.second) - ll(str[i - ] - 'a' + ) * pw2 % mod2 + mod2) % mod2;
int ni = (i + k - ) % (n * k);
h.first = (ll(h.first) * arg1 + ll(str[ni] - 'a' + )) % mod1;
h.second = (ll(h.second) * arg2 + ll(str[ni] - 'a' + )) % mod2;
has[i % k][h]++;
H[i] = h;
}
int m; cin >> m;
string cur;
for (int j = ; j <= m; j++) {
cin >> cur;
pii h = pii(, );
for (int i = ; i < k; i++) {
h.first = (ll(h.first) * arg1 + ll(cur[i] - 'a' + )) % mod1;
h.second = (ll(h.second) * arg2 + ll(cur[i] - 'a' + )) % mod2;
g[h] = j;
}
}
for (int j = ; j < k; j++) if(check(has[j])) {
cout << "YES" << endl;
bool f = ;
for (int i = j; i < n * k; i += k) {
if(f) cout << " ";
cout << g[H[i]]; f = ;
}
cout << endl;
return;
}
cout << "NO" << endl;
}
int main() {
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
solve();
return ;
}
rolling hash的更多相关文章
- Rolling Hash(Rabin-Karp算法)匹配字符串
您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...
- Rolling Hash about the Rsync
今天看文献看到一个有趣的算法—Rolling Hash,这个算法可以更新在不同的machine上的两个“similar”的文件,也叫做rsync algorithm,rsync顾名思义:remote ...
- Hash function
Hash function From Wikipedia, the free encyclopedia A hash function that maps names to integers fr ...
- Hash算法入门指南(聊点不一样的算法人生)
前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...
- 几种常用hash算法及原理
计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...
- 经典Hash函数的实现
Hash函数是指把一个大范围映射到一个小范围.把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存. 除此以外,Hash函数往往应用于查找上.所以,在考虑使用Hash函数之前,需要明白它 ...
- 应用Hash函数
本文系转载,转自:http://www.blogjava.net/jinfei0627/articles/219543.html 应用Hash函数(java描述) 作者:冲处宇宙 时间:2007.1. ...
- 几种经典的hash算法
计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...
- 常见的哈希Hash算法 & MD5 & 对称非对称加密 & 海明码
参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html DJB的算法实现核心是 ...
随机推荐
- BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Hibernate征途(七)之复合主键映射和集合映射
把这两种映射放到一起说,是因为这两种映射不像前面的复用型映射.数量和方向型映射那么分类鲜明,所以放到了这个“其他”里面. 复合主键映射 在关系模型中,复合主键和其他的主键方式没有很大区别,但是反映到对 ...
- delphi 为应用程序添加提示
type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; Edit1: TEdit; procedure Fo ...
- android UI进阶之实现listview的下拉加载
关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现. 最初的下拉加载应该是ios上的效果,现在很多应用如新浪微 ...
- iOS开发——网络编程Swift篇&(八)SwiftyJSON详解
SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...
- Mac OS X 系统目录结构
在OS X的系统中,不再有Windows用户熟悉的C盘.D盘,这是因为OS X底层是Unix系统,其目录机构符合Unix系统的规范.MAC机器主板使用了Intel主导的EFI标准,硬盘分区格式采用GP ...
- PAT 1003
1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...
- debian之source.list详解
之前安装的是debian sarge(内核是2.4.7),不太想更新,但是发现原来的源/ect/apt/source.lists如下,但是用apt-get update,发现大都已经不可用了.怎么办, ...
- BeanDefinitionRegistry extends AliasRegistry
// 用该Registry注册一个新定义的bean,但是新的bean必须支持父的定义和子的定义void registerBeanDefinition(String beanName, BeanDefi ...
- tornado简单的验证码
1.html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...