Codeforces 898F - Restoring the Expression(字符串hash)
898F - Restoring the Expression
思路:字符串hash,base是10,事实证明对2e64取模会T(也许ull很费时),对1e9+7取模。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a)) const int N=1e6+;
const int base=;
const int MOD=1e9+;
ll h[N];
ll p[N];
int num[N];
string s;
void init(string s)
{
int l=s.size();
h[]=;
for(int i=;i<l;i++)
{
h[i+]=(h[i]*base+s[i]-'')%MOD;
}
p[]=;
for(int i=;i<=l;i++)p[i]=(p[i-]*base)%MOD;
}
ll get(int l,int r)
{
if(r-l+<=||l-<||r<)return ;
return ((h[r]-h[l-]*p[r-l+])%MOD+MOD)%MOD;
}
bool is(int l,int r)
{
if(l<||r>=s.size()-||l>=r)return false;
if((r-l>=&&s[l+]=='')||(s.size()>=r+&&s[r+]==''))return false;
mem(num,);
string s1=s.substr(,l+);
string s2=s.substr(l+,r-l);
string s3=s.substr(r+,s.size()-r-);
//cout<<s1<<' '<<s2<<' '<<s3<<endl;
if(s2.size()>s3.size()||s1.size()>s3.size())return false;
if(s1.size()<s2.size())swap(s1,s2);
int tot=;
for(int i=s3.size()-;i>=;i--)
{
if(tot<=s2.size())
{
int t=s1[s1.size()-tot]-''+s2[s2.size()-tot]-''+num[i];
if(t>=)
{
if(i==)return false;
num[i-]=t/;
num[i]=t=t%;
}
if(t!=s3[i]-'')return false;
}
else if(tot<=s1.size())
{
int t=s1[s1.size()-tot]-''+num[i];
if(t>=)
{
if(i==)return false;
num[i-]=t/;
num[i]=t=t%;
}
if(t!=s3[i]-'')return false;
}
else
{
if(num[i]>=)
{
if(i==)return false;
num[i-]=num[i]/;
num[i]=num[i]%;
}
if(num[i]!=s3[i]-'')return false;
}
tot++;
}
return true;
}
void solve(string s)
{
init(s);
int pos=,_pos=;
int l=s.size();
for(int i=l-;i>=;i--)
{
int t=l-i;
ll sumh=get(i+,l);
if((get(,t)+get(t+,i))%MOD==sumh){
pos=t-;
_pos=i-;
if(is(pos,_pos))break;
else pos=_pos=;
}
if((get(,t-)+get(t,i))%MOD==sumh){
pos=t-;
_pos=i-;
if(is(pos,_pos))break;
else pos=_pos=;
}
if((get(,i-t)+get(i-t+,i))%MOD==sumh){
pos=i-t-;
_pos=i-;
if(is(pos,_pos))break;
else pos=_pos=;
}
if((get(,i-t+)+get(i-t+,i))%MOD==sumh){
pos=i-t;
_pos=i-;
if(is(pos,_pos))break;
else pos=_pos=;
}
} for(int i=;i<=pos;i++)putchar(s[i]);
putchar('+');
for(int i=pos+;i<=_pos;i++)putchar(s[i]);
putchar('=');
for(int i=_pos+;i<l;i++)putchar(s[i]);
puts("");
//cout<<pos<<' '<<_pos<<endl;
//cout<<get(1,1)<<' '<<get(2,22)<<' '<<get(23,44)<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>s;
solve(s);
return ;
}
Codeforces 898F - Restoring the Expression(字符串hash)的更多相关文章
- codeforces gym 101164 K Cutting 字符串hash
题意:给你两个字符串a,b,不区分大小写,将b分成三段,重新拼接,问是否能得到A: 思路:暴力枚举两个断点,然后check的时候需要字符串hash,O(1)复杂度N*N: 题目链接:传送门 #prag ...
- 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)
题面戳我 Solution 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还 ...
- Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...
- 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 1056E - Check Transcription - [字符串hash]
题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...
- 【codeforces 514C】Watto and Mechanism(字符串hash)
[题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...
- codeforces 898F Hash
F. Restoring the Expression time limit per test 2 seconds memory limit per test 256 megabytes input ...
- CodeForces - 727E Games on a CD 字符串Hash
题意:有n个单词,每个单词长度为k,顺时针将它们写成一个圆圈串.现在知道g个长度为k的单词,是否可以从这g个单词中选择n个形成这个圆圈串?如果有多个答案,任意输出一个. 思路 可以发现,如果枚举第一个 ...
随机推荐
- [转载]C#深拷贝的方法
首先了解下深拷贝和浅拷贝的定义: 浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对 ...
- [转]mac上安装android sdk
一.先下载android sdk for mac 给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac.s ...
- 消息系统之Apache ActiveMQ
一.下载运行MQ服务 1.下载ActiveMQ :http://activemq.apache.org/ 2.解压缩: 进入bin目录 win32和win64对应不同位的操作系统,选择进入 点击act ...
- IntelliJ IDEA 编译Java程序出现 'Error:java: 无效的源发行版: 9' 解决方法
最新安装的IntelliJ IDEA 2018.1编译器,创建Java Project,并选择之前安装好的Eclipse配置的JDK,如图所示: 在工程中添加 Main.class, main函数中写 ...
- ES6学习笔记之map、set与数组、对象的对比
ES6 ES5中的数据结构,主要是用Array和Object.在ES6中主要新增了Set和Map数据结构.到目前为止,常用的数据结构有四种Array.Object.Set.Map.下面话不多说了,来一 ...
- Ubuntu系统下Jenkins的本地构建基本方法
上一篇文章介绍了,jenkins的安装和系统配置之后,配置登录成功后,就可以新建jenkins构建项目,用于自动化构建. 1.项目名称和项目描述 点击左上角的 新建任务,输入项目名称,选择 构建一个自 ...
- centos/rhel 6.5(更新至centos 7)下rabbitmq安装(最简单方便的方式)
vim /etc/hosts 增加 127.0.0.1 hostname 不然启动的时候可能会报如下错误: [root@devel2 rabbitmq]# rabbitmq-server ERROR: ...
- [Java]接受拖拽文件的窗口
至于这个问题,Java的awt.dnd包下提供了许多完成这一功能的类 例如DropTarget.DropTargetListener等 先来讲一下DropTarget类,这个类完成和拖拽.复制文件等操 ...
- tomcat部署项目如何去掉项目名称
去掉项目名和端口: 首先,进入tomcat的安装目录下的conf目录,我的目录是 /usr/local/apache-tomcat-6.0.20/conf,编辑文件server.xml. 1.去除端口 ...
- Effective TensorFlow Chapter 4: TensorFlow中的广播Broadcast机制【转】
本文转载自:https://blog.csdn.net/LoseInVain/article/details/78763303 TensorFlow支持广播机制(Broadcast),可以广播元素间操 ...