题意:给你一串数,让你找出其中有几个子串是4的倍数(包括总串)。
思路:暴搜必定超时O(n^2),我们可以分类讨论。先考虑一位数,当满足4的倍数时ans++;然后是两位数,满足条件+1,这时就要考虑当两位数满足4的倍数时,前面不管再加多少位,都是4的倍数(100、1000、10000...都能被4整除),那么我就可以把两位数前面的数字(i个)依次加上,他们分别是以两位数为尾的三位数、四位数、五位数...因此ans+i(i从0开始)。O(n+n)。
然后可以把两种情况合并在一个for循环里。O(n)。
/*
?????????▄??????????????▄????
????????▌?█???????????▄??▌???
????????▌??█????????▄????????
????????▄???????▄▄▄??????????
?????▄▄????????????█??▄█?????
???▄?????????????????██??▌???
??????▄▄???????????????▄??▌??
??▌??▌█??????▄?█▄???????█????
?????????????▌██??????????▄▌?
?▌??▄██▄???????????????????▌?
????▄█▄█▌▄???????????????????
?????????▄▄?▄???????????????▌
??????▄▄???▄?????????????????
?▌?????????????????????????▌?
???????????????????????▄?????
???▄?????????????????▄????▌??
?????▄??????????▄▄▄?????▄????
???????▄▄▄▄}???????▄▄??????
?????????????????????????????
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin>>s;
long long ans = 0;
for (int i=0; i<s.size(); i++) {
if ((s[i]-'0')%4 == 0 )//单个字符串被4整除
ans++;
if(i>=1&&(s[i]-'0'+(s[i-1]-'0')*10)%4==0)
ans+=i;
}
printf("%lld\n",ans);
}