码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-08][codeforces][628][B][New Skateboard]

时间:2016-04-08 19:34:06      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-08 13:24:57 星期五

  • 题目编号:[2016-04-08][codeforces][628][B][New Skateboard]

  • 题目大意:给定一个长度最大为3×105的字符串,问有多少个能被4整除的子串,

  • 分析:

    • 每个数字后面两位数能被4整除,那么这个数字就能被4整除
    • dp[i]表示从0~i这一段字符能被4整除的数目,那么dp[i] = dp[i - 1] + (a[i]%4 == 0) + ((a[i-1] * 10 + a[i])%4?0:i)
      • 即,如果第i位能被4整除,那么答案要+1,如果增加第i位后,后面两位能被4整除,那么答案就要加上i,因为由包括后面两位的字符串有i个
  1. #include <cstring>
  2. #include <cstdio>
  3. using namespace std;
  4. typedef long long LL;
  5. const int maxn = 3 * 1E5 + 10;
  6. char str[maxn];
  7. int main(){
  8. scanf("%s",str);
  9. int n = strlen(str);
  10. LL ans = 0;int tmp;
  11. for(int i = 0 ; i < n; ++i){
  12. int tmp = str[i] - ‘0‘;
  13. if(tmp % 4 == 0) ++ans;
  14. if(i){
  15. tmp = (str[i-1] - ‘0‘)*10 + tmp;
  16. if(tmp % 4 == 0) ans += i;
  17. }
  18. }
  19. printf("%I64d\n",ans);
  20. return 0;
  21. }




[2016-04-08][codeforces][628][B][New Skateboard]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/d23ff9110359c6c71e722fb3638ebb22.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!