题意:

给出一个字符串,字符串由"R","G","?"组成,若字符串存在2个R,且2个R中间是一个G,则称该串为“漂亮串”,现考虑将"?"替

换成"R"或"G"的所有字符串,求这些字符串中“漂亮串”的总数。

我们从反面考虑问题,若字符串不是“漂亮串”,则字符串的形式必然为:R...R...R...R,相邻2个R的距离相等且距离为奇

数。

所以我们可以枚举距离,构造“非漂亮串”,毛估总共需要枚举的次数为n*n*(1/1+1/2+...1/n),时间复杂度为O(n^2logn),然后

用总的字符串数(2^k,k为"?"总数)减去“非漂亮串”的总数,就是“漂亮串”的总数了。

解释:

就是我们把任意一个字符串s中的R全部提取出来(只考虑R),如果s不是beautiful string的话,那么所有的R一定具有解题思路里面那种形式

否则的话,就一定是beautiful string了,这个可以用反证法证明

反证分两步,证明相邻两个R距离不等以及存在距离为偶数

这个证明还是容易的

这样对每一个给定字符串,我们根据R的个数分别枚举距离就行了

/*
Pro: 0Sol:date:
*/
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 1000000007
int t;
long long mod_pow(int a,int n,int p)
{long long ret=1;long long A=a;while(n){if (n & 1)ret=(ret*A)%p;A=(A*A)%p;n>>=1;}return ret;
}
int main(){scanf("%d",&t);while( t -- ){char str[808];scanf("%s",str);int len = strlen(str);int unknown = 0, r_num = 0;for(int i = 0; i < len; i ++){if(str[i] == '?') unknown ++;else if(str[i] == 'R') r_num ++;}long long unbea = (r_num == 0);//全为G的是不beautiful的。for(int i = 0; i < len; i ++){//开始遍历if(str[i] == 'R' || str[i] == '?'){//可能是R的情况int x = (str[i] == 'R');unbea = (unbea + (x == r_num) ) % mod;//这是给出的串只有一个R的情况for(int dis = 1; dis + i < len; dis += 2){// + i 枚举距离int y = x;for(int sta = i + dis; sta < len; sta += dis){//枚举第二个位置以及以后y += (str[sta] == 'R');if(str[sta] == 'G') break;unbea = (unbea + (y == r_num) )% mod;//如果遍历到的点和R的个数相同//那么,就加上一个不美丽字符串//这一句话包含了(拿样例4做解释)//RRRR//RRRG RRGG//RGGR//GRRR GRRG//GGRR}}}}printf("%I64d\n",mod_pow(2,unknown,mod) - unbea);}return 0;
}

hdu - 4346 - beautiful road - 枚举+想法相关推荐

  1. hdu 5062 Beautiful Palindrome Number(水题)

    题目链接:hdu 5062 Beautiful Palindrome Number 题目大意:略. 解题思路:暴力或者手算都可以,注意手算的话,分别算出1,2,3...位的情况后,答案是累加上去的. ...

  2. hdu 4309(最大流+枚举状态)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309 思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流 ...

  3. hdu 2363(最短路+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2363 思路:和之前hdu上做过的一题很像...就是先求求出所有的高度差,排序后枚举,每次都一次spfa ...

  4. HDU 4445 Crazy Tank --枚举

    题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数. ...

  5. hdu 3486(RMQ+高效枚举)

    题意:把n分为 均分为m 段 每段n/m个数字  每段可以选一个最大的数 求这些数相加起来>k的最小的m 解题思路:这道题本来想用二分+rmq的,但discuss里面说二分是错的,所以只能另想别 ...

  6. HDU Redraw Beautiful Drawings 推断最大流是否唯一解

    点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 ...

  7. HDU - 6982 J - Road Discount wqs二分 + 模型转换 + 优化

    传送门 文章目录 题意: 思路: 题意: 给你一个nnn个点mmm条边的图,每个边有一个代价以及折扣价,你需要输出nnn行,第iii行代表你可以选i−1i-1i−1条边使其变成优惠价,问每次的最小生成 ...

  8. HDU - 1796——容斥原理+二进制枚举

    [题目描述] Now you get a number N, and a M-integers set, you should find out how many integers which are ...

  9. hdu 6351 Beautiful Now

    http://acm.hdu.edu.cn/showproblem.php?pid=6351 题意:任意交换两个数至多k次求得到的最大的数和最小的数 #include<bits/stdc++.h ...

最新文章

  1. 非计算机专业学习计算机
  2. php中一定要写 吗,PHP编程一定要改掉的5个不良习惯
  3. 无法连接虚拟设备 ide1:0
  4. STL总结 (C++)
  5. py2.7+pyqt4开发端口检测工具
  6. python中字典的常用操作命令及注意事项
  7. Python 学习编程 【for语句breakcontinue语句使用】(一)
  8. 【英语学习】【医学】Unit 08 The Cardiovascular System
  9. ssh连接服务器时特别慢的问题的解决方法
  10. vim打造成golang的IDE
  11. LINUX如何配置IP别名
  12. linux部署java命令
  13. Linux学习笔记--终端命令
  14. 可以让你少奋斗十年的工作经验(转)
  15. 也谈谈古代一两银子相当于今天的价格
  16. css 间隙,CSS间隙属性
  17. js数组方法及其返回值(简单用法)
  18. 基于JavaScript的餐厅点餐系统微信小程序的设计与实现
  19. 2017第十九届中国国际地面材料及铺装技术展览会会刊(参展商名录)
  20. 爱普生R330打印机 win10下 打印照片出现打一半的情况

热门文章

  1. c语言中如何输入log函数,在C语言中使用对数函数的方法
  2. 怎么主动发起话题_如何女生发起聊天话题?
  3. HTML(3):IE浏览器编程
  4. VB.NET实现DirectSound9 (7) 录音
  5. php 运行命令行,命令行运行php报错
  6. 视频内容加密封装技术研究
  7. 浪潮信息m5服务器,浪潮英信服务器NF8480M5
  8. Protobuf序列化
  9. 七星配资市场剧烈震荡
  10. 为什么鸿蒙系统那么火七星彩,七星彩要想独中500万 我们告诉你会出哪些号码!...