cf898f hash

加法性质+hash

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>

using namespace std;

char ch[1000005];
long long pre1[1000005];
long long pre2[1000005];

long long mod1=1e9+7;
long long mod2=1e9+9;

long long fac1[1000005];
long long fac2[1000005];

int len;
bool check(int s1,int s2)
{
    if(s1==1 || s2==s1)
        return false;

    if(ch[1-1]=='0' && s1!=1+1)
        return false;
    if(ch[s1-1]=='0' && s2!=s1+1)
        return false;
    if(ch[s2-1]=='0' && len!=s2)
        return false;


    long long a1=pre1[s1-1]-pre1[0]*fac1[s1-1-0];
    a1=((a1%mod1+mod1)%mod1)%mod1;
    //a1=a1*fac1[s2-1]%mod1;
    long long a2=pre1[s2-1]-pre1[s1-1]*fac1[s2-s1]%mod1;
    a2=((a2%mod1+mod1)%mod1)%mod1;
    //a2=a2*fac1[s2-s1]%mod1;
    long long a3=pre1[len]-pre1[s2-1]*fac1[len-s2+1]%mod1;
    a3=((a3%mod1+mod1)%mod1)%mod1;
    //a3=a3*fac1[len-s1+1]%mod1;
    if(((a1+a2)%mod1)!=a3)
        return false;



    long long aa1=pre2[s1-1]-pre2[0]*fac2[s1-1-0]%mod2;
    aa1=((aa1%mod2+mod2)%mod2)%mod2;
    //aa1=aa1*fac2[s2-1]%mod2;
    long long aa2=pre2[s2-1]-pre2[s1-1]*fac2[s2-s1]%mod2;
    aa2=((aa2%mod2+mod2)%mod2)%mod2;
    //aa2=aa2*fac2[s2-s1]%mod2;
    long long aa3=pre2[len]-pre2[s2-1]*fac2[len-s2+1]%mod2;
    aa3=((aa3%mod2+mod2)%mod2)%mod2;
    if(((aa1+aa2)%mod2)!=aa3)
        return false;

    return true;
}

int main() {
    fac1[0]=fac2[0]=1;
    pre1[0]=pre2[0]=0;

    for(int i=1;i<=1000000;i++)
    {
        fac1[i]=fac1[i-1]*10%mod1;
        fac2[i]=fac2[i-1]*10%mod2;
    }
    while(~scanf("%s",ch))
    {
        len=strlen(ch);
        //cout<<len<<endl;
        for(int i=1;i<=len;i++)
        {
            pre1[i]=(pre1[i-1]*10+(ch[i-1]-'0'))%mod1;
            pre2[i]=(pre2[i-1]*10+(ch[i-1]-'0'))%mod2;
        }

        int ans1,ans2;
        int f=0;
        for(int i=3;i<=len;i++)
        {
            int l1=i-1;
            int l2=len-i+1;
            if(l1>l2*2)
                continue;
            if(l1<l2)
                continue;

            int sta=i-l2;
            for(int j=0;j<2;j++)
            {
                if(check(sta+j,i))
                {
                    ans1=sta+j;ans2=i;
                    f=1;
                    break;
                }
            }
            if(f==1)
                break;
            sta=l2+1;
            //cout<<i<<endl;
            for(int j=0;j<2;j++)
            {
                if(check(sta-j,i))
                {
                    ans1=sta-j;ans2=i;
                    f=1;
                    break;
                }
            }

            if(f==1)
                break;
        }

        //cout<<ans1<<" "<<ans2<<endl;
        for(int i=1;i<ans1;i++)
            printf("%c",ch[i-1]);
        cout<<"+";
        for(int i=ans1;i<ans2;i++)
            printf("%c",ch[i-1]);
        cout<<"=";
        for(int i=ans2;i<=len;i++)
            printf("%c",ch[i-1]);
        cout<<endl;


    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值