对于一个等式,先确定等号的位置,这样等号左右分为了两部分,左侧添加加号后出现的
所有结果及个数用map统计下来,右侧再次搜索,每搜到一个值就加上对应的个数,搜索完毕
累加的结果,即为答案,实现见代码,核心dfs(5行)。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
char str[20];
LL ans,len;
map<LL,LL>pq;
void dfs(LL pos,LL value,LL s,LL limit)
{
if(pos>limit){pq[s+value]++;return;}
if(pos<limit)dfs(pos+1,0,s+value*10+str[pos]-'0',limit);
dfs(pos+1,value*10+str[pos]-'0',s,limit);
}
void _dfs(LL pos,LL value,LL s,LL limit)
{
if(pos>limit){ans=ans+pq[s+value];return;}
if(pos<limit) _dfs(pos+1,0,s+value*10+str[pos]-'0',limit);
_dfs(pos+1,value*10+str[pos]-'0',s,limit);
}
void print()
{
for(map<LL,LL>::iterator it=pq.begin();it!=pq.end();it++)
cout<<it->first<<" "<<it->second<<endl;
}
int main()
{
//freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
while(scanf("%s",str+1)!=EOF)
{
if(strcmp(str+1,"END")==0) break;
len=strlen(str+1);
ans=0;
for(LL i=1;i<=len-1;i++)
{
pq.clear();
dfs(1,0,0,i); //1,i;
_dfs(i+1,0,0,len); //i+1,len;
}
printf("%lld\n",ans);
}
return 0;
}