hdu4909 状态压缩(偶数字符子串)
题意:
给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表
示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ,因为这个wa的快吐血了,题目要求输出一共有多少个子串满足所有字母('a' -'z')出现的次数必须是偶数个。
思路:
首先对于每一个前缀串的奇偶状态我们可以用mark[1<<26]的状态压缩表示,如果当前字母的个数是偶数,那么对应位置的状态就是0,奇数是1,先不考虑'?',假如当前的这个状态在之前出现过,那么当前可以增加的子串数量就是当前状态之前出现的次数,为什么是这样呢?两个相同的状态之间肯定是经过了偶数次变化,奇数 + 偶数 = 奇数,偶数 + 偶数 = 偶数,所以说前面有多少个当前状态,就有多少个偶数间隔,就会有几个满足题意的子串,(也可以全求出来,然后排列组合C(m,2))一个意思,现在在把'?'考虑进来,先算出没意义的情况,然后在枚举他是'a'
- 'z',枚举的时候我是先枚举一遍以'?'结尾的,然后对于?后面的直接就把每一个状态的每一位都改变一次,求出所有的和就行了,还有要注意的一点就是mark[1<<26]数组很大,memset清不起,我们要采取每次只把用过的清空的原则去减少时间。感觉没说清楚,但这个题目不是很好说明白,自己做了将近一天才AC,要是看不懂就看看代码然后自己在想想吧。
#include<stdio.h>
#include<string.h>
int sum[(1<<26)+10];
int num[22000];
char str[22000]; int main ()
{
int i ,j ,t ,ans;
scanf("%d" ,&t);
while(t--)
{
scanf("%s" ,str);
int len = strlen(str);
int mki = -1 ,tt = 0;
num[0] = 0;
sum[num[0]] = 1;
for(ans = i = 0 ;i < len ;i ++)
{
if(str[i] == '?')
{
mki = i;
ans += sum[num[tt]];
sum[num[tt]] ++;
continue;
}
tt ++;
num[tt] = num[tt-1] ^ (1 << (str[i] - 'a'));
ans += sum[num[tt]];
sum[num[tt]] ++;
} for(i = 0 ;i <= tt ;i ++)
sum[num[i]] = 0;
if(mki == -1)
{
printf("%d\n" ,ans);
continue;
}
tt = 0;
num[0] = 0;
sum[num[0]] = 1;
for(i = 0 ;i < mki ;i ++)
{
tt ++;
num[tt] = num[tt-1] ^ (1 << (str[i] - 'a'));
sum[num[tt]] ++;
} for(i = 'a' ;i <= 'z' ;i ++)
{
int tmp = num[tt] ^ (1 << (i - 'a'));
ans += sum[tmp];
} for(i = mki + 1 ;i < len ;i ++)
{
tt ++;
num[tt] = num[tt-1] ^ (1 << (str[i] - 'a'));
for(j = 0 ;j < 26 ;j ++)
ans += sum[num[tt]^(1<<j)];
}
for(int i = 0 ;i <= tt ;i ++)
sum[num[i]] = 0;
printf("%d\n" ,ans);
}
return 0;
}
hdu4909 状态压缩(偶数字符子串)的更多相关文章
- hdu 4057 AC自己主动机+状态压缩dp
http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- Wireless Password - HDU 2825(ac自动机+状态压缩)
题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...
随机推荐
- Java I/O流 05
I/O流·文件递归 统计该文件夹的大小 * 需求:从键盘就收一个文件夹路径,统计该文件夹的大小 package com.heima.test; import java.io.File; import ...
- div中如何让文本元素、img元素水平居中且垂直居中
一.文本元素在div中的水平居中且垂直居中方法 html代码 <div id="box"> <p>文本元素</p> </div> c ...
- MyBatis(一):JDBC使用存在的问题
JDBC使用步骤: a:加载 JDBC 驱动程序 b:创建数据库的连接对象Connection c:根据链接获取Statement d:拼接SQL语句及设置参数 e:执行SQL并获取结果集 f:关闭使 ...
- Scientific Internet Access
下载小飞机 https://github.com/shadowsocksr-backup 寻找ssr https://github.com/Alvin9999/new-pac/wiki/ss%E5%8 ...
- 运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)
前言 上一篇简单介绍了Consul,并使用开发模式(dev)进行流程演示,但在实际开发中需要考虑Consul的高可用和操作安全性,所以接着来聊聊集群和ACL的相关配置,涉及到的命令会在环境搭建过程中详 ...
- Vulkan移植GpuImage(二)Harris角点检测与导向滤波
Harris角点检测 UI还是用的上次扣像的,只有前后置可以用,别的没有效果,只看实现就好. 相应源码 在实现之前,我先重新整理编译glsl的生成工具,如Harris角点检测中间计算过程需要针对rgb ...
- Android Studio 如何在TextView中设置图标并按需调整图标大小
•任务 相信大家对这张图片都不陌生,没错,就是 QQ动态 向我们展示的界面. 如何实现呢? •添加文字并放入图标 新建一个 Activity,取名为 QQ,Android Studio 自动为我们生成 ...
- 图像Resize方式对深度学习模型效果的影响
在基于卷积神经网络的应用过程中,图像Resize是必不可少的一个步骤.通常原始图像尺寸比较大,比如常见监控摄像机出来的是1080P高清或者720P准高清画面,而网络模型输入一般没有这么大,像Yolo系 ...
- 前端学习 node 快速入门 系列 —— 报名系统 - [express]
其他章节请看: 前端学习 node 快速入门 系列 报名系统 - [express] 最简单的报名系统: 只有两个页面 人员信息列表页:展示已报名的人员信息列表.里面有一个报名按钮,点击按钮则会跳转到 ...
- 系统编程-信号-信号发送kill、raise、alarm
信号发送 kill 和 raise函数 kill函数参数详解: 实验1 raise和kill 的使用 #include <stdio.h> #include <signal.h> ...