题意:

      给你一个字符串,里面最多有一个'?','?'可以表示'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 状态压缩(偶数字符子串)的更多相关文章

  1. hdu 4057 AC自己主动机+状态压缩dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...

  2. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  3. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  4. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  5. hdu 2825(ac自动机+状态压缩dp)

    题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...

  6. POJ 1185 炮兵阵地(动态规划+状态压缩)

    炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...

  7. Wireless Password - HDU 2825(ac自动机+状态压缩)

    题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...

  8. 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 ...

  9. HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...

随机推荐

  1. crudapi零代码开发平台应用场景和成功案例

    应用场景 在前面文章中,已经介绍了crudapi主要功能和使用方式,本文主要介绍crudapi应用场景以及具体的使用方式. 概要 crudapi属于产品级的零代码平台,无需编程,通过配置自动生成cru ...

  2. Ubuntu 18.04下Intel SGX应用程序程序开发——获得OCALL调用的返回值

    本文中,我们介绍在Enclave函数中调用不可信OCALL函数,并获得OCALL函数的返回值. 1. 复制SampleEnclave示例并建立自己的OcallRetSum项目 SampleEnclav ...

  3. Java8 BiFunction 简单用用

    最近来了新公司,主要用到了ElasitcSearch,大家都知道在底层查询代码中往往需要判断传入某个参数是否为空来判断设置查询,例如下方代码: BoolQueryBuilder query = Que ...

  4. EF Core 原理从源码出发(二)

    紧接着我的上一篇博客,上回分析到ef 一个重要的对象,changetracker这个对象,当我们向DbContext添加对象的时候我们会调用如下代码. 1 private EntityEntry< ...

  5. java实现回溯算法

    最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结. 什么叫做回溯算法 (摘抄于百度百科) 回溯算法实际上一个类似枚举的 ...

  6. python爬虫加定时任务,制作微信提醒备忘录

    一.任务的记录与提取 1.1 制作每日任务 为了便于爬取,推荐使用网页版的在线记事本,现在这种工具很多,我选择"石墨文档"进行操作演示.记录内容的 格式可以根据自己的需求和爬虫自行 ...

  7. java实现简易的图书馆管理系统

    比较适合新手练手的一个简易项目 直接上源码 Book package code; /** * @author ztr * @version 创建时间:2021年3月4日 下午8:21:40 * 类说明 ...

  8. ch2_8_2求解幸运数问题

    思路:f(x)进行十进制每位相加,g(x)进行二进制每位相加,比较是否相等即可. 小明同学学习了不同的进制之后,拿起了一些数字做起了游戏.小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中 ...

  9. 6、Spring教程之自动装配

    自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean有三种装配机制,分别是: 在xml中显式配置 ...

  10. Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)

    简介 Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发. 规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死.你拥有两种资源 - 生命值(h ...