听说单hash能过23333

于是乎hash乱搞一下就好了辣 然而map要TLE ....

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#include<map>
#define SF scanf
#define PF printf
#define idx(c) ((c)-'a'+1)
using namespace std;
typedef unsigned int LL;
typedef unsigned int uint;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar(); }return x*f;
}
const int MAXN = 4000000;
const int bas = 28;
const int MAXNODE = 4999997;
string A[MAXN+10], B[MAXN+10];
int n, m, len1, len2;
uint base[MAXN+10], Hash[MAXN+10];
int M[MAXNODE+10];
LL sta[MAXNODE+10];
long long ans = 0;
char ch[MAXN+10];
uint hash(int l, int r) {if(l > r) return 0;return Hash[r]-Hash[l-1] * base[r-l+1];
}
int trans(LL x) {int i = x % MAXNODE;for( ; sta[i] != x && ~sta[i]; ) i = (i == MAXNODE) ? 0 : i+1;sta[i] = x;return i;
}
int main() {memset(sta, -1, sizeof(sta));n = read(); m = read(); len1 = read(); len2 = read();base[0] = 1;for(int i = 1; i <= len1+len2; i++) base[i] = base[i-1] * bas;int mid = len1+len2>>1;string *s = A, *t = B;for(int i = 1; i <= n; i++) SF("%s", ch), s[i] = string(ch);for(int i = 1; i <= m; i++) SF("%s", ch), t[i] = string(ch);if(len1 < len2) {swap(s, t);swap(n, m); swap(len1, len2);}for(int i = 1; i <= m; i++) {LL h = 0;for(int j = 0; j < len2; j++)h = h * bas + idx(t[i][j]);M[trans(h)]++;}for(int i = 1; i <= n; i++) {for(int j = 0; j < mid*2; j++) Hash[j+1] = Hash[j] * bas + idx(s[i][j%mid]);LL x = 0;for(int j = mid; j < len1; j++) x = x * bas + idx(s[i][j]);for(int j = 1; j <= mid; j++) {if(hash(j, j+len1-mid-1) == x) {LL t = hash(j+len1-mid, j+mid-1);ans += M[trans(t)];}}}PF("%lld\n", ans);
}

[BZOJ4084][Sdoi2015]bigyration hash相关推荐

  1. 【bzoj4084】[Sdoi2015]bigyration hash

    bzoj没有题面,题面在vijos. 所以说读入char再丢给string并不会慢- 短串扔到hash表里. 长串的前半部分复制一份,然后在上面跑,若长串的后半部分出现过,则答案加上后面的hash值的 ...

  2. bzoj4084 [Sdoi2015]bigyration题解

    由于bzoj没有题面,我就yy一下题意好啦 首先这题很明显没有讲清楚,到底是子串翻转还是全串 然后就写的翻转子串,此时我们可以发现一个串可以得到它的所有排列 然后把所有字符拿出来装在桶里hash一下, ...

  3. [bzoj4084][Sdoi2015]双旋转字符串_hash

    双旋转字符串 bzoj-4084 Sdoi-2015 题目大意:给定两个字符串集合 S 和 T .其中 S 中的所有字符串长度都恰好为 N ,而 T 中所有字符串长度都恰好为 M .且 N+M 恰好为 ...

  4. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  5. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  6. bzoj4084【SDOI2015】bigyration

    感觉字符串题的做法都好神奇-以后一定要优先考虑哈希 假设S是长度较长的集合. 将T中的串哈希,用map记录每个哈希值出现了多少次. 然后枚举S串,在map中找可以拼接的T串的个数. #include& ...

  7. 【bzoj4084】【sdoi2015】双旋转字符串

    题解 首先题中说了$n>=m$; 分成的循环串左右两边为本质相同的单循环串循环串,分别长为$l = \frac{n + m}{2} $; 所以$S$串的前$l$位为双循环串的一半$S1$,后一半 ...

  8. 4084: [Sdoi2015]双旋转字符串

    4084: [Sdoi2015]双旋转字符串 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 394  Solved: 161 [Submit][St ...

  9. Redis 笔记(05)— hash 类型(设置获取单个hash值、判断hash键是否存在、设置获取多个hash值、获取所有hash的键、获取所有hash的值、删除hash指定键)

    Redis 的字典是无序字典.Redis 的字典的值只能是字符串,当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收. hash 结构也可以用来存储用户信息,不同于字符串一次性需要 ...

最新文章

  1. 第三次Scream冲刺
  2. 神圣的NLP!一文理解词性标注、依存分析和命名实体识别任务
  3. linux 解决端口占用
  4. 个人作业-Week1
  5. mybatis3源码1-初始化
  6. 计算机采用二进制无关,计算机为什么采用二进制?
  7. 51单片机数码管小数点c语言,求助一个51单片机控制的数码管计算器带小数点功能的...
  8. 不忘初芯 NEC发布系列工程显示新品解决方案
  9. python做var模型_python中VAR模型的条件预测
  10. JavaWeb 学习路线
  11. 快速生成文件夹内包含的的所有文件的文件名列表
  12. php 聚合广告平台,带统计功能的广告管理系统PHP源码 多维度投放策略 多种风格后台...
  13. 做项目管理有pmp证书了,到底有没有必要再考个prince2?
  14. 使用XML作为数据库
  15. 经营报表-FineReport配置Oracle外接数据库(2)
  16. 程序员应该知道的国外技术网站
  17. 电脑没有鼠标怎么打开计算机,电脑鼠标右键菜单没有打开方式选项怎么办
  18. Linux-centos-7安装
  19. 基于关联规则的足球比赛数据分析
  20. FMDB iphone 数据库

热门文章

  1. 叶史瓦大学计算机专业,叶史瓦的大学排名
  2. verilog中always和initial的区别
  3. 集合竞价 连续竞价 开盘价如何产生
  4. 如何与VMware虚拟机共享文件
  5. QMC5883L磁力计驱动
  6. 3D数据---未来数字世界的物质基础
  7. 全平台福利集合大放送!24h后立刻删!冲!
  8. 《Sony Vegas Pro 12标准教程》——第1章 基础篇——基础知识 1.1 影视剪辑的概念...
  9. 1.3一摞烙饼的问题
  10. 柳传志内部邮件曝光:联想筹备1年等待大反攻