http://codeforces.com/contest/412/problem/E

以@和.为分隔符,统计三部分的字母个数即可。
关键在于.之前必须有@,并且@前面有字母。

/*31ms,980KB*/

const int mx = 1000005;

char s[mx];

int main()
{
    gets(s);
    int i, j, len = strlen(s), lastat = -1;
    ll ans = 0LL, cnt1 = 0LL, cnt2 = 0LL;
    For(i, len)
    {
        if (s[i] == '@' && i)
        {
            cnt1 = 0;
            rForr(j, i - 1, 0) ///判断@前面的字符
         {
                if (s[j] == '@' || s[j] == '.') break;
                if (isalpha(s[j])) cnt1++;
            }
            lastat = i;
        }
        else if (s[i] == '.' && cnt1) /// 必须有cnt1才能统计cnt2
     {
            cnt2 = 0;
            Forr(j, i + 1, len) ///判断.后面的字符
         {
                if (!isalpha(s[j])) break;
                ++cnt2;
            }
            Forr(j, lastat + 1, i) ///判断@.之间的的字符
         {
                if (!isalpha(s[j]) && !isdigit(s[j]))
                {
                    cnt2 = 0;
                    break;
                }
            }
            if (lastat + 1 == i) cnt2 = 0;
        }
        if (cnt1 && cnt2) ans += cnt1 * cnt2, cnt1 = cnt2 = 0;
    }
    PL(ans);
    return 0;
}

Comments

comments powered by Disqus