51nod1313 完美串

一个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[3003];
int n,k;
long long ans=0;
int ls[3003],rs[3003];
short cl[3003][3003],cr[3003][3003],cs[3003][3003];
int l1[3003][3003],r1[3003][3003];
int max(int a,int b){return a>b?a:b;}
int C(int x){return x*(x+1)/2;}
int main(){
    scanf("%d%s",&k,s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;++i)if(s[i]!=‘G‘)s[i]=0;
    for(int i=1;i<=n;++i)if(s[i])cs[i][i]=cl[i][i]=cr[i][i]=1;
    for(int d=1;d<n;++d)for(int l=1,r=1+d;r<=n;++l,++r){
        if(s[r])cl[l][r]=cl[l][r-1]+1;
        if(s[l])cr[l][r]=cr[l+1][r]+1;
        cs[l][r]=max(max(cs[l][r-1],cs[l+1][r]),max(cl[l][r],cr[l][r]));
    }
    for(int i=1;i<=n;++i){
        for(int j=1;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+1];
    for(int i=1;i<n;++i)ans+=1ll*ls[i]*C(n-i)+1ll*rs[i+1]*i-1ll*ls[i]*rs[i+1];
    for(int i=1;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=1;j<k;++j)r1[i][j]+=r1[i+1][j];
    for(int i=1;i<=n;++i)for(int j=k-1;j;--j)r1[i][j]+=r1[i][j+1];
    for(int i=1;i<n;++i)for(int j=1;j<k;++j)ans+=1ll*l1[i][j]*r1[i+1][k-j];
    printf("%lld",ans);
    return 0;
}

一个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)的个数。
时间: 2024-10-09 00:19:48

51nod1313 完美串的相关文章

完美串(区间dp)

完美串 Description 爱美之心人皆有之,GG也不例外.所以GG他对于完美串有一种热衷的爱.在GG眼中完美串是一个具有无比魅力的01子串.这个子串有之其魅力之处,对它取反后水平翻转,它又和它原来的一模一样.这就是GG热爱它的原因.但是世上并不是所有的01串都是完美串,所以GG下定决心想改造01串,使所有的01串都成为完美串.但是改造01串是一个巨大的工程,GG太忙了,他还差T个01串未改造,他需要你的帮助.而你只需要告诉它至少添加几个'0','1'字符就可以使得01串成为完美串. Inp

广工校赛——LCS——完美串

Description 爱美之心人皆有之,GG也不例外.所以GG他对于完美串有一种热衷的爱.在GG眼中完美串是一个具有无比魅力的01子串.这个子串有之其魅力之处,对它取反后水平翻转,它又和它原来的一模一样.这就是GG热爱它的原因.但是世上并不是所有的01串都是完美串,所以GG下定决心想改造01串,使所有的01串都成为完美串.但是改造01串是一个巨大的工程,GG太忙了,他还差T个01串未改造,他需要你的帮助.而你只需要告诉它至少添加几个'0','1'字符就可以使得01串成为完美串. Input 有

完美串 (DP)

传送门 中文题. 可以想到当只有一个字符那么最少要添加1个,两个连续不相等的字符不需要添加. 可以设dp[i][j]代表从i到j最少需要添加几个. 分为两种情况:当 s[i] == s[j] 的时候,那么一定需要添加一个,可以在i的左边 也可以在j的右边,如果在i的左边加 那就是dp[i][j-1] + 1,添加的那个字符就是和s[j]相反的. 如果在j的右边加 那就是dp[i+1][j] + 1,添加的字符与s[i]相反.当然dp[i][j]取二者的较小值. 当s[i] != s[j]的时候,

URAL1081——DP—— Binary Lexicographic Sequence

Description Consider all the sequences with length (0 <  N < 44), containing only the elements 0 and 1, and no two ones are adjacent (110 is not a valid sequence of length 3, 0101 is a valid sequence of length 4). Write a program which finds the seq

2015 GDUT校赛

周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . A  游戏王 . 目的是集齐6张卡, 然后n个小伙伴手上持有卡num, 给出m种集合 , Stubird需要有某个集合中的卡片才能用c的花费去买这张卡片. 做法是状压dp , 开一个 dp[st] , 表示st( 0 <= st < (1<<6) ) 这个集合最小花费 . 然后开一个邻

CF356E - Xenia and String Problem

也许更好的阅读体验 \(\mathcal{Description}\) 定义一种字符串\(gray\)串满足: 长度为奇数 正中间的字母只出现一次 左右两端相同,左右两端也是gray串 一个\(gray\)串的贡献为这个串长度的平方 需要注意的是一个长度为\(7\)的\(gray\)串是包含了长度为\(1,3\)的\(gray\)的 现给你一个长为\(n(n<=100,000)\)的字符串,你可以修改至多一个字母,使得总贡献值最大 输入方式为一个字符串 \(\mathcal{Solution}\

吉哥系列故事——完美队形I(最长严格递增回文串 +hdu 4512)

吉哥系列故事--完美队形I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2652    Accepted Submission(s): 862 Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这

HDU ACM 4513 吉哥系列故事——完美队形II-&gt;求最长回文串(manacher算法)

分析:该題可以通过求最长回文串的方法来解决:求最长回文串使用manacher算法,O(n)时间复杂度. 注意:while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2])这里多出的判断a[i-len[i]]<=a[i-len[i]+2]即为该題的限制从左到中保证身高不降,因在回文串的计算过程中添加了额外的字符,所以这里是i-len[i]+2而不是i-len[i]+1,以避开添加的字符. #include<ios

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

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1012    Accepted Submission(s): 358 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让