HNU13303 Counting substhreengs(递推)
2015-07-26 10:14
344 查看
题目:http://acm.hnu.cn/online/?action=problem&type=show&id=13303&courseid=0
题意:给你一个字符串,由数字和其他字符组成,问有多少个子串,使得子串里面的数字和为3的整数倍(子串必须连续,而且里面不能有其他字符)。
分析:开3个数组,dp0[i],dp1[i],dp2[i]。dp0[i]表示从字符串的最后一个位置到位置i有多少个字符串的和是0的倍数,dp1[i],dp2[i]类似。从后往前推,那么假如当前位置为i,(str[i]-'0')%3==1,dp0[i]=dp2[i+1],。。。。
代码:
题意:给你一个字符串,由数字和其他字符组成,问有多少个子串,使得子串里面的数字和为3的整数倍(子串必须连续,而且里面不能有其他字符)。
分析:开3个数组,dp0[i],dp1[i],dp2[i]。dp0[i]表示从字符串的最后一个位置到位置i有多少个字符串的和是0的倍数,dp1[i],dp2[i]类似。从后往前推,那么假如当前位置为i,(str[i]-'0')%3==1,dp0[i]=dp2[i+1],。。。。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1e6+10; char str[maxn]; long long dp0[maxn],dp1[maxn],dp2[maxn]; int main() { int len,i,j,x; long long ans,Sum; while(scanf("%s",str)!=EOF) { len=strlen(str); memset(dp0,0,sizeof(dp0[0])*(len+2)); memset(dp1,0,sizeof(dp0[0])*(len+2)); memset(dp2,0,sizeof(dp0[0])*(len+2)); ans=0; for(i=len-1;i>=0;i--) { if(str[i]>='0' && str[i]<='9') { x=(str[i]-'0')%3; if(x==1) { ans+=dp2[i+1]; dp0[i]=dp2[i+1]; dp1[i]=dp0[i+1]; dp2[i]=dp1[i+1]; dp1[i]++; } else if(x==2) { ans+=dp1[i+1]; dp0[i]=dp1[i+1]; dp1[i]=dp2[i+1]; dp2[i]=dp0[i+1]; dp2[i]++; } else { ans+=dp0[i+1]+1; dp0[i]=dp0[i+1]; dp1[i]=dp1[i+1]; dp2[i]=dp2[i+1]; dp0[i]++; } } else { dp0[i]=dp1[i]=dp2[i]=0; } } cout<<ans<<'\n'; } return 0; }
相关文章推荐
- linux下如何用c语言调用shell命令http://blog.csdn.net/hzhsan/article/details/7989921
- VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法
- CentOS下cp命令中拷贝所有的写法
- AIX6.1/11.2.0.3在有关数据库SWAP一个BUG
- MFC之目录结构及消息流转(一)
- Decode the tape
- Android_Audio_Omap_HAL
- Xcode6.4中,第三方插件无法使用的解决方法
- 学习C++的感想
- 如何查看树莓派的DNS
- HDU 5305 Friends
- Asteroids - poj 3041(二分图最大匹配问题)
- Linux中TTY是什么意思
- 菜鸟初行---HelloWorld
- [C++学习笔记]--动态分配内存空间
- 北海道中文离线地图App上线
- 独木舟上的旅行
- 鼠标经过子元素触发mouseout,mouseover事件的解决方案
- Start cluster zookeeper in shell script
- TCP编程,Socket通讯