给出一个数字串,插入加号和等号使之成立。求成立的算式数。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
new HDU4403().solve();
}
}
class HDU4403 {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
void calc(String s , Map<Long , Long> cnt){
dfs(s , 1 , 0 , s.charAt(0)-'0' , cnt) ;
}
void dfs(String s , int idx , long sum , long num , Map<Long , Long>cnt){
if(idx >= s.length()){
sum += num ;
if(cnt.containsKey(sum)) cnt.put(sum , 1+cnt.get(sum)) ;
else cnt.put(sum , 1L) ;
return ;
}
dfs(s, idx+1 , sum , num*10 + s.charAt(idx) - '0' , cnt) ;
dfs(s, idx+1 , sum+num , s.charAt(idx) - '0' , cnt) ;
}
void solve() {
Map<Long , Long> cntLeft = new HashMap<Long, Long>() ;
Map<Long , Long> cntRight = new HashMap<Long, Long>() ;
String str ;
long sum ;
while(! (str = in.next()).equals("END")){
sum = 0L ;
for(int i = 1 ; i < str.length() ; i++){
cntLeft.clear() ;
cntRight.clear() ;
calc(str.substring(0 , i) , cntLeft) ;
calc(str.substring(i) , cntRight) ;
for(Map.Entry<Long , Long> it : cntLeft.entrySet()){
if(cntRight.containsKey(it.getKey()))
sum += it.getValue() * cntRight.get(it.getKey()) ;
}
}
out.println(sum) ;
}
out.flush() ;
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = new StringTokenizer("") ;
}
private void eat(String s){
tokenizer = new StringTokenizer(s) ;
}
public String nextLine(){
try {
return reader.readLine() ;
} catch (Exception e) {
return null ;
}
}
public boolean hasNext(){
while(!tokenizer.hasMoreTokens()){
String s = nextLine() ;
if(s == null) return false ;
eat(s) ;
}
return true ;
}
public String next() {
hasNext() ;
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}