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的更多相关文章

  1. 【LEETCODE】53、数组分类,简单级别,题目:989、674、1018、724、840、747

    真的感觉有点难... 这还是简单级别... 我也是醉了 package y2019.Algorithm.array; import java.math.BigDecimal; import java. ...

  2. ZR#1005

    ZR#1005 解法: 题解给了一个建图跑最短路的做法,但好像没有必要,因为 $ m $ 没有用,所以直接上完全背包就行了. CODE: #include<iostream> #inclu ...

  3. ZR#1004

    ZR#1004 解法: 对于 $ (x^2 + y)^2 \equiv (x^2 - y)^2 + 1 \pmod p $ 化简并整理得 $ 4x^2y \equiv 1 \pmod p $ 即 $ ...

  4. ZR#1009

    ZR#1009 解法: 因为无敌的SR给了一个大暴力算法,所以通过打表发现了了一些神奇的性质,即第一行和第一列的对应位置数值相等. 我们可以通过手算得出 $ F(n) = \frac{n(n + 1) ...

  5. ZR#1008

    ZR#1008 解法: 直接预处理出来执行完一个完整的串可以到达的位置,然后算出重复的次数直接乘在坐标上,最后处理一下余下的部分就行了. CODE: #include<iostream> ...

  6. ZR#1015

    ZR#1015 解法: 我们需要求得, $ g_i $ 表示长度为的最长不下降子序列个数. 设 $ f_{i,j} $ 表示统计第前$ i $ 个数字,得到最长不下降子序列末端为 $ j $ . 显然 ...

  7. ZR#1012

    ## ZR#1012 blog咕咕咕了好久,开始补. 解法: 一个很显然的性质, $ x $ 只能转移到 $ x+1 $ 或者 $ 2x $ 处,所以我们可以以此性质建图,即 $ x $ 向 $ x ...

  8. ZR#985

    ZR#985 解法: 可以先假设每个区间中所有颜色都出现,然后减掉多算的答案.对每种颜色记录它出现的位置,则相邻两个位置间的所有区间都要减去,时间复杂度 $ O(n) $ . 其实可以理解为加法原理的 ...

  9. ZR#984

    ZR#984 解法: 异或的一个性质: $ a+b \geq a \bigoplus b$ 所以一边读入一边把读进来的值加到答案就行了. #include<iostream> #inclu ...

随机推荐

  1. PHP导出XML格式的EXCEL

    <?php function Export(){ set_time_limit(0); ob_start(); $biz = new ZaikuBiz(); $biz->setSearch ...

  2. 【转载】 C#使用Math.Round方法对计算结果进行四舍五入操作

    在C#的数值运算中,有时候需要对计算结果进行四舍五入操作,此时就可使用内置方法Math.Round方法来实现四舍五入操作,Math.Round方法有多个重载函数,支持设置有效位数进行四舍五入,如果没有 ...

  3. VS2017 Git failed with a fatal error. error: open(".vs/xxxxxx/v15/Server/sqlite3/db.lock"): Permission denied fatal: Unable to process path .vs/xxxxxx/v15/Server/sqlite3/db.lock

    具体错误信息:Git failed with a fatal error. error: open(".vs/xxxxxx/v15/Server/sqlite3/db.lock") ...

  4. JavaScript之控制标签内容

    function abb(a){ return document.getElementById(a); } console.log(abb('box').innerHTML); 标签.innerHTM ...

  5. Oracle 11g 服务器结构

    Oracle 服务器主要又实例.数据库.程序全局区和前台进程组成. 实例可以进一步划分为系统全局区(SGA)和后台进程(PMON.SMON等)两部分,其中,SGA 使用操作系统的内存资源,而后台进程需 ...

  6. 《Clean Code》读书笔记——第二周

    本周我阅读了<Clean Code>. “神在细节中!”,建筑家范德罗如是说.他当然专注于基于宏伟构架之上的永恒建筑形式,他也同样为自己设计的建筑挑选门把手.同样软件开发也是这样,小处见大 ...

  7. Python学习日记(四) 集合和元祖

    元祖的特性:是一个只读列表.可以循环.可以切片,修改数据遵循'儿子'不能改但'孙子'可能可以改. iterable:可迭代对象(元祖.列表.字串.集合) 元祖宣告方式: tu = (1,2,3,['a ...

  8. 【hadoop】看懂WordCount例子

    前言:今天刚开始看到map和reduce类里面的内容时,说实话一片迷茫,who are you?,最后实在没办法,上B站看别人的解说视频,再加上自己去网上查java的包的解释,终于把WordCount ...

  9. JSONObject对象

    1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包. 方法: 的getString() ...

  10. shell脚本——正则表达式

    什么是正则表达式 正则表达式分为基础正则和扩展正则,都是为了匹配符合预期要求的字符串 正则表达式与通配符的区别 只需要记住,对文件内容或是展示文本的操作都是正则,而对目录或文件名的操作则都是通配符(例 ...