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 ...
随机推荐
- 2015.12.25-2016.01.01 大论文迭代B
大论文B轮迭代,稍重前端 12.25 周五,完善摘要 12.26 周六,完善第一章 12.27 周天,完善第二章 12.28 周一,完善第三章 12.29 周二,完善第四章 12.30 周三,完善第五 ...
- PHP连接mysql8.0出错“SQLSTATE[HY000] [2054] The server requested authentication method unkno…
今天安装安装一个叫得推校园O2O系统的使劲都说连接不上服务器. 下面是安装说明,我直接进行3步骤,导入数据库配置文件,结果就显示题目报错的内容 安装说明: 直接输入程序目录即可 http://loca ...
- Python编码格式导致的csv读取错误
Python编码格式导致的csv读取错误(pandas.read_csv) 本文记录python小白我今天遇到的这两个问题(csv.reader和pandas.csv_read): pandas模块“ ...
- [luogu2594 ZJOI2009]染色游戏(博弈论)
传送门 Solution 对于硬币问题,结论是:当前局面的SG值等于所有背面朝上的单个硬币SG值的异或和 对于求单个背面朝上的硬币SG值...打表找规律吧 Code //By Menteur_Hxy ...
- render: h => h(App) $mount 什么意思
初始一个vue.js项目时,常常发现main.js里有如下代码: new Vue({ render: h => h(App) }).$mount('#app') 这什么意思?那我自己做项目怎么改 ...
- python BeautiulSoup
==============================================查找网页中<a>标签中的链接from bs4 import BeautifulSoup with ...
- vuejs验证码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...
- hibernate之单表映射
目录 第一章 Hibernate初识 1-1 课程介绍 1-2 什么是ORM 1-3 Hibnerate简介 1-4 开发前的准备 1-5 编写第一个Hibernate例子 1-6 创建hiberna ...
- Javascript控制回车键进行表单(form)提交(转)
一.采用钩子事件去捕获 键盘事件有3个: keydown,keypress,keyup分别是按下,按着没上抬,上抬键盘 . $(document).keyup(function(event){ if( ...
- sqlserver 字符串函数
转自:http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 以下所有例子均Studnet表为例: 计算字符串长度len( ...