bzoj 4084 双旋转字符串
给两个集合A,B,找满足要求的(a,b)的对数,可以计算对于a,哪些b成立.
还有就是字符串hash的使用,感觉平时用字符串hash太少了.
/**************************************************************
Problem: 4084
User: idy002
Language: C++
Result: Accepted
Time:6456 ms
Memory:290272 kb
****************************************************************/ #include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
#define N 8000010
#define Base 31
#define Mod 1000000007
using namespace std; typedef long long dnt; int n, m, ln, lm;
char *sa[N], *sb[N];
char buf_arr[N], *buf=buf_arr;
dnt fx[N], sx[N], pow[N];
int fail[N];
multiset<int> stb; int hash( char *s ) {
dnt rt = ;
for( int i=; s[i]; i++ )
rt = (rt*Base + s[i]-'a') % Mod;
return rt;
}
void init_hash( int ln, char *s ) { // ln>=1
fx[] = s[]-'a';
for( int j=; j<ln; j++ )
fx[j] = (fx[j-]*Base + s[j]-'a') % Mod;
sx[ln-] = s[ln-]-'a';
for( int j=ln-; j>=; j-- )
sx[j] = ((s[j]-'a')*pow[ln--j] + sx[j+]) % Mod;
}
void init_fail( char *s ) {
fail[] = ;
fail[] = ;
for( int i=; s[i]; i++ ) {
int j=fail[i];
while( j && s[j]!=s[i] ) j=fail[j];
if( s[j]==s[i] )
fail[i+]=j+;
else
fail[i+]=;
}
}
void work1() { // ln > lm
vector<int> vc;
int ll = (ln+lm)>>;
dnt ans = ;
for( int t=; t<=n; t++ ) {
init_fail(sa[t]+ll);
for( int i=; i<ll; i++ )
buf[i] = sa[t][i];
for( int i=; i<ll; i++ )
buf[ll+i] = sa[t][i];
init_hash(ll+ll,buf);
vc.clear();
int i=, j=;
while( i<ln- ) {
while( i<ln- && j<ln-ll && buf[i]==sa[t][ll+j] ) i++, j++;
if( j==ln-ll ) {
dnt v;
v = fx[i+(ll+ll-ln)-]-fx[i-]*pow[ll+ll-ln];
v = (v%Mod+Mod) % Mod;
vc.push_back(v);
j = fail[ln-ll];
}
if( i==ln- ) break;
while( j && sa[t][ll+j]!=buf[i] ) j=fail[j];
if( sa[t][ll+j]!=buf[i] ) i++;
}
sort( vc.begin(), vc.end() );
vc.erase( unique(vc.begin(),vc.end()), vc.end() );
for( int t=; t<vc.size(); t++ )
ans += stb.count(vc[t]);
}
printf( "%lld\n", ans );
}
void work3() { // ln = lm
vector<int> vc;
dnt ans = ;
for( int i=; i<=n; i++ ) {
init_hash(ln,sa[i]);
vc.clear();
vc.push_back( sx[] );
for( int j=; j<ln; j++ ) {
int v = ((dnt)sx[j]*pow[j]+fx[j-]) % Mod;
vc.push_back(v);
}
sort( vc.begin(), vc.end() );
vc.erase( unique(vc.begin(), vc.end()), vc.end() );
for( int t=; t<vc.size(); t++ )
ans += stb.count(vc[t]);
}
printf( "%lld\n", ans );
}
int main() {
scanf( "%d%d%d%d", &n, &m, &ln, &lm );
if( ln>lm ) {
for( int i=; i<=n; i++ ) {
scanf( "%s", buf );
sa[i] = buf;
buf += ln+;
}
for( int i=; i<=m; i++ ) {
scanf( "%s", buf );
sb[i] = buf;
buf += lm+;
}
} else {
swap(n,m);
swap(ln,lm);
for( int i=; i<=m; i++ ) {
scanf( "%s", buf );
sb[i] = buf;
reverse( buf, buf+lm );
buf += lm+;
}
for( int i=; i<=n; i++ ) {
scanf( "%s", buf );
sa[i] = buf;
reverse( buf, buf+ln );
buf += ln+;
}
}
pow[] = ;
for( int i=; i<=ln; i++ )
pow[i] = pow[i-]*Base % Mod;
for( int i=; i<=m; i++ )
stb.insert( hash(sb[i]) );
if( ln!=lm )
work1();
else
work3();
}
bzoj 4084 双旋转字符串的更多相关文章
- [bzoj4084][Sdoi2015]双旋转字符串_hash
双旋转字符串 bzoj-4084 Sdoi-2015 题目大意:给定两个字符串集合 S 和 T .其中 S 中的所有字符串长度都恰好为 N ,而 T 中所有字符串长度都恰好为 M .且 N+M 恰好为 ...
- BZOJ 4084 [Sdoi2015]双旋转字符串
题解:hash 至今不会unsigned long long 的输出 把B扔进map 找A[mid+1][lenA]在A[1][mid]中的位置 把A[1][mid]贴两遍(套路) 枚举A[mid+1 ...
- 【bzoj4084】【sdoi2015】双旋转字符串
题解 首先题中说了$n>=m$; 分成的循环串左右两边为本质相同的单循环串循环串,分别长为$l = \frac{n + m}{2} $; 所以$S$串的前$l$位为双循环串的一半$S1$,后一半 ...
- 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串
一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...
- 【面试题042】翻转单词顺序VS左旋转字符串
[面试题042]翻转单词顺序VS左旋转字符串 题目一: 输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I a ...
- lintcode :旋转字符串
题目: 旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdef ...
- 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】
题目地址:http://ac.jobdu.com/problem.php?pid=1362 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运 ...
- LintCode 面试题 旋转字符串
1.题目描述 题目链接:http://www.lintcode.com/zh-cn/problem/rotate-string/ 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 2. ...
- 1289 大鱼吃小鱼 1305 Pairwise Sum and Divide 1344 走格子 1347 旋转字符串 1381 硬币游戏
1289 大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右 ...
随机推荐
- lnmp使用socket方式连接nginx优化php-fpm性能
lnmp使用socket方式连接nginx优化php-fpm性能 Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domain socket?- ...
- spring初识
Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的.Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益. Sp ...
- 如何把JS对象转成数组
1. 前言 首先,当JS对象是键值对的情况时(Json对象),因为数组时以数字为索引的,所以只能把JS对象中的Key或者Value组成数组使用. 2. 样例如下: var obj={"one ...
- vue系列之webpack
webpack 地址: https://github.com/vuejs-templates/webpack 注意里面的template,用webpack创建的项目,结构就是这样的
- 温故而知新--JavaScript书摘(二)
前言 毕业到入职腾讯已经差不多一年的时光了,接触了很多项目,也积累了很多实践经验,在处理问题的方式方法上有很大的提升.随着时间的增加,愈加发现基础知识的重要性,很多开发过程中遇到的问题都是由最基础的知 ...
- js----DOM对象(3
表格示例(取消,全选,反选): <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 性能测试十六:liunx下jmete配置环境变量
修改环境变量后就不用每次手动输入路径,省时省事,减少命令长度和出错率 按Ctrl+L可进行翻页,翻页到最后一行,此处有java的环境变量 添加jmeter的目录和bin目录 此时,虽修改成功,但是并未 ...
- python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...
- python 全栈开发,Day43(引子,协程介绍,Greenlet模块,Gevent模块,Gevent之同步与异步)
昨日内容回顾 I/O模型,面试会问到I/O操作,不占用CPU.它内部有一个专门的处理I/O模块.print和写log 属于I/O操作,它不占用CPU 线程GIL保证一个进程中的多个线程在同一时刻只有一 ...
- python 全栈开发,Day8(文件操作)
一.文件操作流程 文件以什么编码存储的,就以什么编码打开 参数: 1.文件路径 2.编码方式,encode 3.执行动作(打开方式):只读,只写,追加,读写,写读... 打开一个已经存在的文件 f = ...