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++11 (judge verdict: Accepted)

#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define rep(i, n) for (int i = 0; i < n; i++)
#define vec vector

int main(void)
{
    while(1) {
        string s;
        cin >> s;
        if (s == "0") break;
        vec<int> a((int)s.length());
        char p = '0';
        rep(i, (int)s.length()) a[i] = int(s[i]) - int(p);

        vec<vec<int>> dp((int)s.length() + 1, vec<int>(11, 0));
        dp[0][0] = 0;
        rep(i, (int)s.length()) {
            rep(j, 11) dp[i + 1][(j * 10 + a[i]) % 11] = dp[i][j];
            if (a[i]) dp[i + 1][a[i]]++;
        }

        int ans = 0;
        rep(i, (int)s.length()) ans += dp[i + 1][0];
        cout << ans << endl;
    }
    return 0;
}