ZR#989
ZR#989
先吐槽一下这个ZZ出题人,卡哈希表。
我就不写那个能过的类高精了,直接写哈希的题解
解法:
判断两个数相加结果是否等于第三个数, 可以直接用 hash判断.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
const int N = 1e5 + 100;
struct hash {
int base, mod;
int cnt, Hash[N], num[N];
hash() {
cnt = 0,num[0] = 1;
base = 10,mod = 1e9 + 7;
}
void init() {cnt = 0;}
void insert(int c) {
cnt++;
Hash[cnt] = (1LL * Hash[cnt - 1] * base + c) % mod;
num[cnt] = (1LL * num[cnt - 1] * base) % mod;
}
int query(int l, int r) {
if(l == 1) return Hash[r];
return (Hash[r] - (1LL * Hash[l - 1] * num[r - l + 1] % mod) + mod) % mod;
}
friend bool check(hash &ch, int l1, int r1,hash &b, int l2, int r2, hash &c, int l3, int r3) {
if((ch.query(l1, r1) + b.query(l2, r2)) % ch.mod != c.query(l3, r3)) return false;
return true;
}
}Hash[4];
char ch[4][N];
int len[4], oldlen[4],T;
int main() {
scanf("%d",&T);
while(T--) {
scanf("%s%s%s", ch[1] + 1, ch[2] + 1, ch[3] + 1);
for(int i = 1 ; i <= 3 ; i++) {
oldlen[i] = len[i] = strlen(ch[i] + 1);
Hash[i].init();
}
for(int i = 1 ; i <= 3 ; i++) {
for(int j = 1 ; j <= len[i] ; j++) {
Hash[i].insert(ch[i][j] - '0');
}
}
int x = 0, y = 0, z = 0;
while(len[3] <= max(len[1], len[2]) + 1) {
z++;
ch[3][++len[3]] = '0';
Hash[3].insert(0);
}
while(len[1] < len[3]) {
ch[1][++len[1]] = '0';
Hash[1].insert(0);
}
while(len[2] < len[3]) {
ch[2][++len[2]] = '0';
Hash[2].insert(0);
}
bool flag = 1;
for(int i = oldlen[1]; i <= len[1] && flag; i++) {
if(check(Hash[1], 1, i, Hash[2], 1, len[2] - 1, Hash[3], 1, len[3])) {
flag = 0;
x = i - oldlen[1];
y = len[2] - 1 - oldlen[2];
break;
}
if(check(Hash[1], 1, i, Hash[2], 1, len[2], Hash[3], 1, len[3])) {
flag = 0;
x = i - oldlen[1];
y = len[2] - oldlen[2];
break;
}
}
for(int i = oldlen[2]; i <= len[2] && flag; i++) {
if(check(Hash[1], 1, len[1] - 1, Hash[2], 1, i, Hash[3], 1, len[3])) {
flag = 0;
x = len[1] - 1 - oldlen[1];
y = i - oldlen[2];
break;
}
if(check(Hash[1], 1, len[1], Hash[2], 1, i, Hash[3], 1, len[3])) {
flag = 0;
x = len[1] - oldlen[1];
y = i - oldlen[2];
break;
}
}
if(flag) puts("-1");
else printf("%d %d %d\n", x, y, z);
}
//system("pause");
return 0;
}
ZR#989的更多相关文章
- 【LEETCODE】53、数组分类,简单级别,题目:989、674、1018、724、840、747
真的感觉有点难... 这还是简单级别... 我也是醉了 package y2019.Algorithm.array; import java.math.BigDecimal; import java. ...
- ZR#1005
ZR#1005 解法: 题解给了一个建图跑最短路的做法,但好像没有必要,因为 $ m $ 没有用,所以直接上完全背包就行了. CODE: #include<iostream> #inclu ...
- ZR#1004
ZR#1004 解法: 对于 $ (x^2 + y)^2 \equiv (x^2 - y)^2 + 1 \pmod p $ 化简并整理得 $ 4x^2y \equiv 1 \pmod p $ 即 $ ...
- ZR#1009
ZR#1009 解法: 因为无敌的SR给了一个大暴力算法,所以通过打表发现了了一些神奇的性质,即第一行和第一列的对应位置数值相等. 我们可以通过手算得出 $ F(n) = \frac{n(n + 1) ...
- ZR#1008
ZR#1008 解法: 直接预处理出来执行完一个完整的串可以到达的位置,然后算出重复的次数直接乘在坐标上,最后处理一下余下的部分就行了. CODE: #include<iostream> ...
- ZR#1015
ZR#1015 解法: 我们需要求得, $ g_i $ 表示长度为的最长不下降子序列个数. 设 $ f_{i,j} $ 表示统计第前$ i $ 个数字,得到最长不下降子序列末端为 $ j $ . 显然 ...
- ZR#1012
## ZR#1012 blog咕咕咕了好久,开始补. 解法: 一个很显然的性质, $ x $ 只能转移到 $ x+1 $ 或者 $ 2x $ 处,所以我们可以以此性质建图,即 $ x $ 向 $ x ...
- ZR#985
ZR#985 解法: 可以先假设每个区间中所有颜色都出现,然后减掉多算的答案.对每种颜色记录它出现的位置,则相邻两个位置间的所有区间都要减去,时间复杂度 $ O(n) $ . 其实可以理解为加法原理的 ...
- ZR#984
ZR#984 解法: 异或的一个性质: $ a+b \geq a \bigoplus b$ 所以一边读入一边把读进来的值加到答案就行了. #include<iostream> #inclu ...
随机推荐
- apache-httpd代理请求,selinux造成503问题的解决方法
NameVirtualHost *:80 <VirtualHost *:80> ServerName test.baidu.com ProxyPreserveHost on ProxyPa ...
- lnmp环境快速搭建及原理解析
刚开始学习php的时候是在wamp环境下开发的,后来才接触到 lnmp 环境当时安装lnmp是按照一大长篇文档一步步的编译安装,当时是真不知道是在做什么啊!脑袋一片空白~~,只知道按照那么长的一篇文档 ...
- iOS - 小功能 跳转到淘宝或天猫的商品展示详情页
最近做iOS项目的时候遇到一个需求,点击广告页,跳转到淘宝或天猫的商品详情页. 具体需要是这样: 1)安装了淘宝:跳转到淘宝详情页. 2)没装淘宝,装了天猫:跳转到天猫详情页 3)淘宝.天猫都没装:跳 ...
- 微服务与SpringCloud简介
A.官网 https://spring.io/projects/spring-cloud B.简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用 ...
- 浅谈对BFC的认识,以及用bfc解决浮动问题
我们在前端的学习过程中常常会遇到BFC,用BFC来解决一些margin塌陷.margin合并清理浮动流的问题 那么问题来了,我们所说的BFC到底是个什么东西呢: 什么是BFC BFC(Block Fo ...
- iOS 作为蓝牙外设广播信息
苹果蓝牙后台的限制,原本广播会有两个段分别是localName和serviceUUID这两块,但现在后台广播时,是不发送在这两段的 手机app可以作为一个蓝牙外设端来模拟外设硬件,但广播包里的数据只能 ...
- Jquery简单闭包
<html> <body> <script src="Js/Index.js"></script> <script type= ...
- linux系统编程面试题
说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 1.堆和栈有什么区别? (1)栈由操作系统分配和释放:堆则是程序员手动去 ...
- 使用Cloudera Manager搭建YARN集群及YARN HA
使用Cloudera Manager搭建YARN集群及YARN HA 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建YARN集群 1& ...
- Vue路由实现页面跳转的两种方式(router-link和JS)
Vue.js 路由可以通过不同的 URL 访问不同的内容,实现多视图的单页 Web 应用 1.通过 <router-link> 实现 <router-link> 组件用于设置一 ...