也是需要查看,然后修改,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的更多相关文章

  1. Rolling Hash(Rabin-Karp算法)匹配字符串

    您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...

  2. Rolling Hash about the Rsync

    今天看文献看到一个有趣的算法—Rolling Hash,这个算法可以更新在不同的machine上的两个“similar”的文件,也叫做rsync algorithm,rsync顾名思义:remote ...

  3. Hash function

    Hash function From Wikipedia, the free encyclopedia   A hash function that maps names to integers fr ...

  4. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

  5. 几种常用hash算法及原理

    计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...

  6. 经典Hash函数的实现

    Hash函数是指把一个大范围映射到一个小范围.把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存. 除此以外,Hash函数往往应用于查找上.所以,在考虑使用Hash函数之前,需要明白它 ...

  7. 应用Hash函数

    本文系转载,转自:http://www.blogjava.net/jinfei0627/articles/219543.html 应用Hash函数(java描述) 作者:冲处宇宙 时间:2007.1. ...

  8. 几种经典的hash算法

    计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...

  9. 常见的哈希Hash算法 & MD5 & 对称非对称加密 & 海明码

    参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html DJB的算法实现核心是 ...

随机推荐

  1. DB9 公头母头引脚定义及连接

    1.实物及引脚简单介绍 在做开发的时候常常会用到串行接口,一般9针的串行接口居多.例如以下图所看到的: 公头母头用于连接线的採用上图封装.但用于开发板的时候採用90度弯角插针的封装.例如以下图: 各引 ...

  2. 【linux设备模型】之platform设备驱动

    一.platform总线.设备和驱动     platform是一种虚拟总线,对应的设备称为platform_device,对应的驱动称为platform_driver. platform_devic ...

  3. Java设计模式12:常用设计模式之外观模式(结构型模式)

    1. Java之外观模式(Facade Pattern) (1)概述:       现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划 ...

  4. Hibernate的回调与拦截

    在Hibernate中,有两种方式可以捕获实体对象的GRUD操作并执行相应的处理 Hibernate回调(org.hibernate.classic.Lifecycle接口): //Provides ...

  5. HTTP重定向服务器

    程序基本流程如下: 代码组织结构如下: HTTP重定向服务主线程: package com.server; import java.io.IOException; import java.net.Se ...

  6. [改善Java代码]优先选择线程池

    在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New ...

  7. 关于eclipse中删除多余的工作空间记录

    这个Eclipse是拷贝的别人的,前三个是别人在使用这个Eclipse的时候定义的路径,到我本地机器是多余的.如何删除这三个默认的工作空间路径. 这个路径的list是读取的Eclipse中的一个文件, ...

  8. saltstack实战4--综合练习3

    Saltstack配置管理-业务引用haproxy 在业务模块里写它的配置 各个业务是不同的,这里有差异性,所以没写在配置模块里. 对minion02也执行安装haproxy [root@master ...

  9. Redis 命令 - Server

    BGREWRITEAOF Asynchronously rewrite the append-only file BGSAVE Asynchronously save the dataset to d ...

  10. Ubuntu系统应用程序创建快捷方式的方法

    大家安装了最新版的Ubuntu 14.0系统之后可能觉得很不习惯,因为Ubuntu的桌面干干净净没有任何快捷方式,任务栏的图标拖不下来,右键点击程序图标也没有创建快捷方式的菜单选项: 那如何把自己经常 ...