一个N长的字符串S(N<=3000),只由'R','G','B'三种字符组成,即串中不存在除了这3个字符以外的其他字符。字符串S的子串substr(L,R)指S[L]S[L+1]S[L+2]..S[R]构成的字符串,其中0<=L<=R<N。称一个字符串为“完美串”,当且仅当该串中存在K个连续的'G'字符。问,存在多少个不同的四元组(a,b,c,d)满足substr(a,b)+substr(c,d)是完美串,其中,0 <= a <= b < c <= d < N。

说明:字符串A和字符串B的+运算指将B连在A的后面,即A+B=AB,如“RRG”+“GBB”=“RRGGBB”。
 
例如:S="GRG",K=2,因为S中一共就2个'G',而要求K=2,所以只有1个四元组(0,0,2,2)成立,即"G"+"G"="GG".
Input
第一行一个整数K,1<=K<=3000.
第二行一个字符串S,1<=len(S)<=3000,且只由'R','G','B'三种字符组成。
Output
一个整数,即不同的四元组(a,b,c,d)的个数。

容斥+dp,

ans=([a,b]存在k个连续的'G',[c,d]任意的方案数)+([c,d]存在k个连续的'G',[a,b]任意的方案数)-([a,b],[c,d]都存在k个连续的'G'的方案数)+([a,b],[c,d]都不存在k个连续的'G',但拼起来之后存在k个连续的'G'的方案数)

#include<cstdio>
#include<cstring>
char s[];
int n,k;
long long ans=;
int ls[],rs[];
short cl[][],cr[][],cs[][];
int l1[][],r1[][];
int max(int a,int b){return a>b?a:b;}
int C(int x){return x*(x+)/;}
int main(){
scanf("%d%s",&k,s+);
n=strlen(s+);
for(int i=;i<=n;++i)if(s[i]!='G')s[i]=;
for(int i=;i<=n;++i)if(s[i])cs[i][i]=cl[i][i]=cr[i][i]=;
for(int d=;d<n;++d)for(int l=,r=+d;r<=n;++l,++r){
if(s[r])cl[l][r]=cl[l][r-]+;
if(s[l])cr[l][r]=cr[l+][r]+;
cs[l][r]=max(max(cs[l][r-],cs[l+][r]),max(cl[l][r],cr[l][r]));
}
for(int i=;i<=n;++i){
for(int j=;j<=i;++j)if(cs[j][i]>=k)++ls[i];
for(int j=i;j<=n;++j)if(cs[i][j]>=k)++rs[i];
}
for(int i=n;i;--i)rs[i]+=rs[i+];
for(int i=;i<n;++i)ans+=1ll*ls[i]*C(n-i)+1ll*rs[i+]*i-1ll*ls[i]*rs[i+];
for(int i=;i<=n;++i)for(int j=i;j<=n;++j){
if(cs[i][j]<k&&cs[i][j]){
if(cl[i][j])++l1[j][cl[i][j]];
if(cr[i][j])++r1[i][cr[i][j]];
}
}
for(int i=n;i;--i)for(int j=;j<k;++j)r1[i][j]+=r1[i+][j];
for(int i=;i<=n;++i)for(int j=k-;j;--j)r1[i][j]+=r1[i][j+];
for(int i=;i<n;++i)for(int j=;j<k;++j)ans+=1ll*l1[i][j]*r1[i+][k-j];
printf("%lld",ans);
return ;
}
一个N长的字符串S(N<=3000),只由'R','G','B'三种字符组成,即串中不存在除了这3个字符以外的其他字符。字符串S的子串substr(L,R)指S[L]S[L+1]S[L+2]..S[R]构成的字符串,其中0<=L<=R<N。称一个字符串为“完美串”,当且仅当该串中存在K个连续的'G'字符。问,存在多少个不同的四元组(a,b,c,d)满足substr(a,b)+substr(c,d)是完美串,其中,0 <= a <= b < c <= d < N。

说明:字符串A和字符串B的+运算指将B连在A的后面,即A+B=AB,如“RRG”+“GBB”=“RRGGBB”。
 
例如:S="GRG",K=2,因为S中一共就2个'G',而要求K=2,所以只有1个四元组(0,0,2,2)成立,即"G"+"G"="GG".
Input
第一行一个整数K,1<=K<=3000.
第二行一个字符串S,1<=len(S)<=3000,且只由'R','G','B'三种字符组成。
Output
一个整数,即不同的四元组(a,b,c,d)的个数。

51nod1313 完美串的更多相关文章

  1. 完美串(区间dp)

    完美串 Description 爱美之心人皆有之,GG也不例外.所以GG他对于完美串有一种热衷的爱.在GG眼中完美串是一个具有无比魅力的01子串.这个子串有之其魅力之处,对它取反后水平翻转,它又和它原 ...

  2. CF356E - Xenia and String Problem

    也许更好的阅读体验 \(\mathcal{Description}\) 定义一种字符串\(gray\)串满足: 长度为奇数 正中间的字母只出现一次 左右两端相同,左右两端也是gray串 一个\(gra ...

  3. 2015 GDUT校赛

    周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . ...

  4. 完美的代价(swap成回文串、贪心)

    Description 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的. 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串 ...

  5. 回文串---吉哥系列故事——完美队形II

    HDU  4513 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出 ...

  6. hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  7. (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...

  8. [RouterOS] ROS对接碧海威或PA等流控实现完美流控详细教程(附脚本全免费)

    前言: 经常在群里看到不少朋友争论海蜘蛛 ROS 维盟 爱快 碧海威 流控大师 Woyos等等软路由,哪个好.实际上,网络产品是复杂的,现在的软路由功能上已经远远不是单独的路由了.每种产品都有他本身的 ...

  9. HDU 4513 吉哥系列故事——完美队形II (Manacher变形)

    题意:假设有n个人按顺序的身高分别是h[1], h[2] ... h[n],从中挑出一些人形成一个新的队形,新的队形若满足以下要求,则就是新的完美队形:  1.连续的 2.形成回文串 3.从左到中间那 ...

随机推荐

  1. UVa 10810 - Ultra-QuickSort

    题目大意:给出一个数列,每次交换相邻数字,求排成递增序的最少交换次数. 分析:求逆序数,合并排序 #include<cstdio>#include<cstring>#inclu ...

  2. dedecms调用子栏目内容,缩略图,以及栏目名字

    织梦后台栏目页默认是没有添加缩略图的选项的,所以首先我们要调整后台提交表单使界面出现上传图片的地方,如下图所示:   织梦后台默认是没有栏目缩略图选项的,所以首先你需要从网上下载对应需要修改的文件,从 ...

  3. jQuery停止动画和判断是否处于动画状态

    1.停止元素的动画 stop([clearQueue][,gotoEnd]); 参数clearQHCHC和gotoEnd都足町选的参数,为Boolean值(ture或flase).clearQueue ...

  4. leetcode 110 Balanced Binary Tree ----- java

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. Codeforces Round #124 (Div. 2)

    A. Plate Game 如果可以放置一个圆的情况下,先手将圆放置在矩形正中心,那么根据对称性,先手只要放后手的对称的位置即可,也就是先手必胜,否则后手胜. B. Limit 讨论\(n,m\)的大 ...

  6. POJ 1488 Tex Quotes --- 水题

    POJ 1488 题目大意:给定一篇文章,将它的左引号转成 ``(1的左边),右引号转成 ''(两个 ' ) 解题思路:水题,设置一个bool变量标记是左引号还是右引号即可 /* POJ 1488 T ...

  7. Python爬虫学习笔记——豆瓣登陆(一)

    #-*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup import html5lib import re import ...

  8. springMvc源码学习之:spirngMvc获取请求参数的方法

    一.      通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMeth ...

  9. docker学习2-安装实践

    windows上安装docker后,默认自动在后台运行,右下角有docker图标,鼠标右键点击出现菜单 可以查看docker版本,对一些基本项进行设置如下: 安装及具体操作参见官方文档: https: ...

  10. RxJava + Retrofit 的实际应用场景

    关于 RxJava Retrofit 很多篇文章都有详细的说明,在这里我想分享一个具体的使用案例,在我的开源项目 就看天气 里的实际应用.也希望跟大家探讨如何优雅的使用. 准备 项目中用到的依赖: c ...