import java.util.*; public class abs_font { public static void main(String[] args) { new abs_font(new Scanner(System.in)); } int N, oo = 987654321; Node[] vs; int[] numDigits; Choice[][] memo; Choice INF_CHOICE = new Choice(oo, -1, -1); // The current node and the shift int go(int i, int s) { if (memo[i][s] != null) return memo[i][s].res; Choice res = INF_CHOICE; // Create a header from [a, b) for (int d=1; d<=5; d++) { int a = s+2+d; while (s+2+d+numDigits[a] > a) a = s+2+d+numDigits[a]; if (a != (s+2+d+numDigits[a])) System.out.printf("BADNESS %d : %d%n", a, s+2+d+numDigits[a]); int sum = a; for (Node nxt : vs[i].children) { sum += go(nxt.id, sum); sum = Math.min(sum, oo); } if (sum < oo && numDigits[sum] == d) res = res.min(new Choice(sum-s, a, sum)); } memo[i][s] = res; return res.res; } public abs_font(Scanner in) { int idcnt = 0; ArrayDeque stk = new ArrayDeque(); String s = in.next(); N = s.length()/2; vs = new Node[N]; int maxSum = 1000000; numDigits = new int[maxSum+1]; for (int i=0; i 0) stk.peek().children.add(curNode); stk.push(curNode); } else { stk.pop(); } } StringBuilder sb = new StringBuilder(); for (Node cur : vs) { go(cur.id, sb.length()); Choice c = memo[cur.id][sb.length()]; sb.append(String.format("%d,%d:", c.a, c.b)); } System.out.println(sb); } } class Node { int id; ArrayList children; public Node(int ii) { id=ii; children = new ArrayList(); } } class Choice { int res, a, b; public Choice(int rr, int aa, int bb) { res=rr; a=aa; b=bb; } Choice min(Choice rhs) { if (rhs.res < res) return rhs; return this; } }