首页 > 其他 > 详细

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

时间:2016-04-08 19:31:02      阅读:165      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!