Problem:
Problem H: Eleven Lover

Edward Leven loves multiples of eleven very much. When he sees a number, he always tries
to find consecutive subsequences (or substrings) forming multiples of eleven. He calls such
subsequences as 11-sequences. For example, he can find an 11-sequence 781 in a number 17819.

He thinks a number which has many 11-sequences is a good number. He would like to find out
a very good number. As the first step, he wants an easy way to count how many 11-sequences
are there in a given number. Even for him, counting them from a big number is not easy.
Fortunately, one of his friends, you, is a brilliant programmer. He asks you to write a program
to count the number of 11-sequences. Note that an 11-sequence must be a positive number
without leading zeros.

Input

The input is a sequence of lines each of which contains a number consisting of less than or equal
to 80000 digits.

The end of the input is indicated by a line containing a single zero, which should not be processed.

Output

For each input number, output a line containing the number of 11-sequences.

You can assume the answer fits in a 32-bit signed integer.

Sample Input

17819
1111
11011
1234567891011121314151617181920
0

Output for the Sample Input

1
4
4
38

Solution in C++ (judge verdict: Accepted)

#include <set>
#include <cstring>
#include <iostream>
#include <cstdio>
#define REP(i,n) for(int i=0; i<(int)(n); i++)

using namespace std;

char str[80010];
int len;
int memo[80010][11];

int solve(int pos, int mod){
  if(memo[pos][mod] != -1) return memo[pos][mod];
  if(mod == 0){
    if(pos == len - 1) return 1;
    else return memo[pos][mod] = 1 + solve(pos + 1, str[pos + 1] - '0');
  }else{
    if(pos == len - 1) return 0;
    int next = mod * 10 + (str[pos + 1] - '0');
    return memo[pos][mod] = solve(pos + 1, next % 11);
  }
}

int main(){
  while(scanf("%s", str)){
    len = strlen(str);
    if(len == 1 && str[0] == '0') break;
    memset(memo, -1, sizeof(memo));
    int ans = 0;
    REP(i,len) if(str[i] != '0'){
      int tmp = solve(i, str[i] - '0');
      ans += tmp;
      // printf("S: %s, pos: %d, ans: %d\n", str, i, tmp);
    }
    printf("%d\n", ans);
  }
  return 0;
}