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的算法实现核心是 ...
 
随机推荐
- Codeforces Testing Round #12 B. Restaurant 贪心
			
B. Restaurant Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/problem ...
 - Android Camera
			
Android调用系统api使用照相机功能,实现拍照获取图片以及从照相机库中获取指定图片的功能. 下面是演示样例代码: <?xml version="1.0" encodin ...
 - android 退出整个程序
			
上网学了好多方法,关于Android的Activity如何退出.好多方法都不行啦,试了各种方法,下面这种方法就是我最喜欢的,简单又容易懂. 使用单例模式创建一个Activity管理对象,该对象中有一个 ...
 - c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿
			
c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast ...
 - Metadata Lock原理7
			
http://blog.itpub.net/22664653/viewspace-1791744/ 一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合 ...
 - 解决Server Error in '/' Application.方法!
			
<!-- Web.Config Configuration File --> <configuration> <system.web> ...
 - Spark Streaming metadata checkpoint
			
Checkpointing 一个流应用程序必须全天候运行,所有必须能够解决应用程序逻辑无关的故障(如系统错误,JVM崩溃等).为了使这成为可能,Spark Streaming需要checkpoint足 ...
 - 怎样用VB自动更新应用程序
			
具体程序实现如下:在应用程序工程MyApp中的部分代码如下:Option Explicit'编译后的应用程序名称,注意没有后缀 .EXE,本例为MYAPPPrivate Const App_Name ...
 - 杂乱无章之javascript(一)
			
1.in 要求第一个(左边的)操作数必须是字符串类型或是可以转化成字符串类型的其他类型,而第二(右边的)操作数必须是数组或对象.只有第一个操作数的值是第二个操作数的属性名,才会返回true,否则返回f ...
 - css笔记07:通配符选择器
			
通配符选择器: * { margin:10px ;//默认四个位置参数全为零 margin-top:10px;//分别设置四个参数 margin-left:10px; margin-right:0px ...