codeforces 898F Hash
2 seconds
256 megabytes
standard input
standard output
A correct expression of the form a+b=c was written; a, b and c are non-negative integers without leading zeros. In this expression, the plus and equally signs were lost. The task is to restore the expression. In other words, one character '+' and one character '=' should be inserted into given sequence of digits so that:
- character'+' is placed on the left of character '=',
- characters '+' and '=' split the sequence into three non-empty subsequences consisting of digits (let's call the left part a, the middle part — b and the right part — c),
- all the three parts a, b and c do not contain leading zeros,
- it is true that a+b=c.
It is guaranteed that in given tests answer always exists.
The first line contains a non-empty string consisting of digits. The length of the string does not exceed 106.
Output the restored expression. If there are several solutions, you can print any of them.
Note that the answer at first should contain two terms (divided with symbol '+'), and then the result of their addition, before which symbol'=' should be.
Do not separate numbers and operation signs with spaces. Strictly follow the output format given in the examples.
If you remove symbol '+' and symbol '=' from answer string you should get a string, same as string from the input data.
12345168
123+45=168
099
0+9=9
199100
1+99=100
123123123456456456579579579
123123123+456456456=579579579 大意:其实看样例就行了 题解:A+B=C A是x位数,B是y位数,C是z位数, x 和 y 中至少有一个和 z 相等或比 z 小 1。
有了这个条件,就可以O(L)枚举+的位置,然后O(1)找出=可能在的位置,关键就是怎么检验值相等? RK hash给了我启示,长度为len的序列的前缀1……m的hash值可以用一个MOD进制数表示,想要知道x……y的hash值:
Hash[x,y]=Hash[1,y]-Hash[1,x-1]*10^(y-x+1)
多取几个MOD来检验就基本可以保证正确性。
/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
int xx=0,ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
int re=1;
while(p){
if(p&1)
re=1LL*re*a%mod;
p>>=1;
a=1LL*a*a%mod;
}
return re;
}
int get_Hash(int xx,int yy,int mod){
//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
if(s[1]=='0'&&x!=1)
return 0;
if(s[x+1]=='0'&&y!=x+1)
return 0;
if(s[y+1]=='0'&&len!=y+1)
return 0;
for(int i=1;i<=4;i++)
if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
return 0;
return 1;
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
gets(s+1);
len=strlen(s+1);
for(int i=1;i<=4;i++)
for(int j=1;j<=len;j++)
Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
/*for(int i=1;i<=4;i++){
for(int j=0;j<=len;j++)
printf("%d ",Hash[i][j]);
puts("");
}*/
int i,j;
for(i=1;i<=len/2-(len%2==0);i++){
j=len-i;
if(j/2+(j%2==1)>i){
j=i+(j/2);
if(check(i,j))
break;
}
else{
j=len-i;
if(i==j)
break;
if(check(i,j))
break;
j=len-i-1;
if(check(i,j))
break;
}
}
for(int k=1;k<=len;k++){
printf("%c",s[k]);
if(k==i)
printf("+");
else if(k==j)
printf("=");
}
puts("");
return 0;
}
细节很多很多,交了五次。
要注意前缀 0 的问题
codeforces 898F Hash的更多相关文章
- Codeforces 898F - Restoring the Expression(字符串hash)
898F - Restoring the Expression 思路:字符串hash,base是10,事实证明对2e64取模会T(也许ull很费时),对1e9+7取模. 代码: #include< ...
- F - Restoring the Expression CodeForces - 898F
字符串hash: base设置为10 枚举'='可能出现的位置,从1/2处开始到大概1/3处结束,当然大概的1/3不用计算,直接到最后就行,因为本题必然有解,输出直接结束即可. 根据'='号位置,' ...
- Codeforces Round #451 (Div. 2) [ D. Alarm Clock ] [ E. Squares and not squares ] [ F. Restoring the Expression ]
PROBLEM D. Alarm Clock 题 OvO http://codeforces.com/contest/898/problem/D codeforces 898d 解 从前往后枚举,放进 ...
- Codeforces Round #109 (Div. 2) E. Double Profiles hash
题目链接: http://codeforces.com/problemset/problem/155/E E. Double Profiles time limit per test 3 second ...
- Codeforces Beta Round #4 (Div. 2 Only) C. Registration system hash
C. Registration system Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...
- CodeForces 1056E - Check Transcription - [字符串hash]
题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...
- Codeforces Beta Round #7 D. Palindrome Degree hash
D. Palindrome Degree 题目连接: http://www.codeforces.com/contest/7/problem/D Description String s of len ...
- Codeforces 25E Test 【Hash】
Codeforces 25E Test E. Test Sometimes it is hard to prepare tests for programming problems. Now Bob ...
随机推荐
- JS高级——arguments
arguments 1.函数内部的一个对象,在函数调用的时候,默认的会将所有传入的实参依次存入该对象 2.是一个伪数组 3.arguments.length 可以用来表示传入实参的个数 4.argum ...
- 遍历select搜索结果,只取数字标key值,防止重复
//遍历select搜索结果,只取数字标key值,防止重复 foreach ($row as $key => $value) { if (is_int($key)) { echo $value; ...
- React-Native WebView动态加载字体
背景 使用react-native构建的iOS/Android双端APP,通过WebView加载本地页面,需要根据服务器提供的字体列表实现下载和动态加载. 本地字体检查 有些字体手机操作系统已经提供了 ...
- Ubuntu14.4安装mysql
一.安装 apt-get install mysql-server mysql-client 设置用户名和密码 二.检查 sudo service mysql restart 三.支持 1.apach ...
- Caffe2:添加CUDA路径
在使用Eclipse时候,仍然出现 libcuda.so 找不到的情况..... 原因:cuda环境没有设置到系统环境中. 方案: 设置CUDA path: 在bashrc中添加路径,只对当前用户产生 ...
- Vue项目在IE浏览器报错polyfill-eventsource added missing EventSource to window
已经安装了babel-polyfill,依然报错.
- CAD直接打印,不出现打印对话框(com接口VB语言)
主要用到函数说明: MxDrawXCustomFunction::Mx_Print 直接打印,不出现打印对话框,详细说明如下: 参数 说明 double ptLBx 打印的范围左下角x double ...
- PAT-day1
1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 3n+1)砍掉一半.这样一直 ...
- (5.2.1)配置服务器参数——即时文件初始化(IFI)
关键词:零填充,即时文件初始化 转自:https://www.cnblogs.com/gaizai/p/3516905.html 概念: 所有新申请的空间,sql server都要以0来填充完磁盘文件 ...
- Codeforces Round #468 Div. 2题解
A. Friends Meeting time limit per test 1 second memory limit per test 256 megabytes input standard i ...