参考博客:https://blog.csdn.net/lengqiu2015/article/details/76855681#reply

题意

给出一个长度为n的01串 我们定义F(x,y)是区间[x,y]内1的数量 请你计算有多少三元组(i,j,k)满足i<j<k,s[j]是1而且F[i,j]等于F[j,k] n<=200000

分析

一开始一直在想怎么枚举j然后计算方案数,发现这样我只能写O(N^2),GG。

原来可以把题目转化一下,问这个串内有多少区间内有奇数个1(单独一个1或者1000或者0001这一类的都属于非法的)。

然后可以用dp来解决(好像也可以不用dp?)

dp[i][0]是以i为结尾的区间含有奇数个1的有多少

dp[i][1]是以i为结尾的区间含有偶数个1的有多少

那么转移就比较好想了:

如果i是1,那么dp[i][1]=dp[i-1][0],dp[i][0]=dp[i-1][1]+1(奇数变偶数,偶数变奇数)

如果i是0,那么dp[i][1]=dp[i-1][1],dp[i][0]=dp[i-1][0]+1

这样把所有的dp[i][0]加起来,再减掉非法的区间就可以了~

这个题要开long long。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
char a[maxn];
long long dp[maxn][]; int n,T;
long long ans; int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&n);
scanf("%s",a+);
ans=;
memset(dp,,sizeof(dp));
if(a[]==''){
dp[][]=;
dp[][]=;
}
if(a[]==''){
dp[][]=;
dp[][]=;
}
for(int i=;i<=n;i++){
if(a[i]==''){
dp[i][]=dp[i-][]+;
dp[i][]=dp[i-][];
}else if(a[i]==''){
dp[i][]=dp[i-][];
dp[i][]=dp[i-][]+;
}
}
for(int i=;i<=n;i++){
ans+=dp[i][];
}
//下面去掉10000
long long res=,all=; for(int i=n;i>=;i--){
if(a[i]==''){
all+=res;
res=;
}
else
res++;
}
ans-=all;
//下面去掉00001
res=,all=;
for(int i=;i<=n;i++){
if(a[i]==''){
all+=res;
res=;
}
else
res++;
}
ans-=all;
cout<<ans<<endl;
}
return ;
}

最新文章

  1. php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别
  2. (转)C#为什么要使用Invoke,它和BeginInvoke有什么区别
  3. HighCharts选项和参数详细配置查询表
  4. 解决php的“It is not safe to rely on the system’s timezone settings”问题
  5. Python3 学习第八弹: 模块学习一之模块变量
  6. WCF 绑定(Binding)
  7. short a = 128, byte b = (byte)a 强制类型转换
  8. [转] 再叙TIME_WAIT
  9. JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)
  10. 从Java到C++——从union到VARIANT与CComVariant的深层剖析
  11. JAVA 调用 R 语言
  12. Git与远程reposiory的相关命令
  13. ES2015 中的函数式Mixin
  14. js 浏览器兼容css中webkit、Moz、O、ms...写法封装(es6语法)
  15. junit常用注解详细说明
  16. ES6定型数组
  17. uoj#188. 【UR #13】Sanrd(Min_25筛)
  18. 【2017下集美大学软工1412班_助教博客】团队作业3——需求改进&amp;系统设计团队成绩公示
  19. 下列没有直接采用XML技术的是( )
  20. 神奇的 ViewDragHelper,让你轻松定制拥有拖拽能力的 ViewGroup

热门文章

  1. warning MSB8004: Output Directory does not end with a trailing slash.
  2. TCP服务器端口数,最大连接数以及MaxUserPort的关系辨真
  3. 转:C++模板特化的概念
  4. easyui1.4 汉化出问题
  5. Navicat for MySQL导入.sql文件
  6. git身份验证失败清除密码缓存
  7. python中的configparse学习笔记
  8. Linux: How to delete a disk or LUN reference from /dev
  9. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
  10. 分布式缓存系统 Memcached slab和item的主要操作