列表

详情


NC21352. 红蓝字符串

描述

给你一个偶数长度的字符串,你想要给每一个字符标记成蓝色或者红色,使得红色的字符序列等于蓝色的字符序列,一共有多少种方法可以做这件事

输入描述

输入一行包含一个字符串s, (2 ≤ |s| ≤ 40)
字符串的每个字符为'o'或者'x'

输出描述

输出一个整数

示例1

输入:

oxox

输出:

2

示例2

输入:

oooxxx

输出:

0

示例3

输入:

xoxxox

输出:

4

示例4

输入:

xo

输出:

0

示例5

输入:

ooooxoox

输出:

8

示例6

输入:

ooxxoxox

输出:

8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 353ms, 内存消耗: 504K, 提交时间: 2019-04-05 16:05:59

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 45
using namespace std;
char s[maxn];
bool a[maxn],b[maxn];
int n,n1,n0;
long long ans,dp[maxn][maxn];
long long check(){
    for(int i=0;i<=n;i++){
        for(int j=0;j<=(n>>1);j++){
            dp[i][j]=0;
        }
    }
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=min(i,(n>>1));j++){
            if(j&&dp[i-1][j-1]&&b[j]==a[i])dp[i][j]+=dp[i-1][j-1];
            if(j<i&&dp[i-1][j]&&b[i-j]==a[i])dp[i][j]+=dp[i-1][j];
        }
    }
    return dp[n][n>>1];
}
void dfs(int step){
    if(step>(n>>1)){
        ans+=check();
        return;
    }
    if(n1){
        n1--;
        b[step]=1;
        dfs(step+1);
        n1++;
    }
    if(n0){
        n0--;
        b[step]=0;
        dfs(step+1);
        n0++;
    }
}
int main(){
    scanf("%s",s);
    n=strlen(s);
    for(int i=1;i<=n;i++){
        a[i]=(s[i-1]=='x');
        n1+=a[i],n0+=!a[i];
    }
    n1>>=1,n0>>=1;
    dfs(1);
    printf("%lld",ans);
    return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 850ms, 内存消耗: 460K, 提交时间: 2023-03-25 19:54:15

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int dp[50][50];
int sta2[50],sta1[50];
int cnt1,cnt2,ans,len;
int getans(){
   memset(dp,0,sizeof dp);
   dp[0][0]=1;
   for(int i=1;i<=len;++i){
   	for(int j=1;j<=(len/2);++j){
   		if(sta2[i-1]==sta1[j-1]) dp[i][j]+=dp[i-1][j-1];
   		if(i>j&&sta2[i-1]==sta1[i-j-1]) dp[i][j]+=dp[i-1][j];
	   }
   }
   return dp[len][len/2];
}
inline void dfs(int n){
	if(cnt1==0&&cnt2==0){
	    ans+=getans();
	}
	if(cnt1>0){
		cnt1--;
		sta1[n]=0;
		dfs(n+1);
		cnt1++;
	}
	if(cnt2>0){
		cnt2--;
		sta1[n]=1;
		dfs(n+1);
		cnt2++;
	}
}
signed main(){
	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>s;
	len=s.size();
	for(int i=0;i<len;++i){
    if(s[i]=='o'){
    	cnt1++;
    	sta2[i]=0;
	}else{
		cnt2++;
		sta2[i]=1;
	}
}
	cnt1>>=1;
	cnt2>>=1;
	dfs(0);
	cout<<ans*2;
	
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 902ms, 内存消耗: 488K, 提交时间: 2023-04-11 11:45:58

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int dp[50][50];
int sta2[50],sta1[50];
int cnt1,cnt2,ans,len;

int getans(){
	memset(dp,0,sizeof dp);
	dp[0][0]=1;
	
	for(int i = 1; i <= len; i ++ ) {
		for(int j = 1; j <= (len / 2); j ++ ) {
			if(sta2[i - 1] == sta1[j - 1]) dp[i][j] += dp[i-1][j-1];
			if(i > j && sta2[i - 1] == sta1[i - j - 1]) dp[i][j] += dp[i-1][j];
		}
	}
	return dp[len][len/2];
}


void dfs(int n){
	if(cnt1==0&&cnt2==0){
		ans += getans();
	}
	if(cnt1>0){
		cnt1--;
		sta1[n]=0;
		dfs(n+1);
		cnt1++;
	}
	if(cnt2>0){
		cnt2--;
		sta1[n]=1;
		dfs(n+1);
		cnt2++;
	}
}


signed main()
{
	cin>>s;
	len=s.size();
	for(int i=0;i<len;++i){
		if(s[i]=='o'){
			cnt1++;
			sta2[i]=0;
		}
		else{
			cnt2++;
			sta2[i]=1;
		}
	}
	cnt1 >>= 1;
	cnt2 >>= 1;
	
	dfs(0);
	cout << ans*2;
	
	return 0;
}

/*
ooooxxxx
 */

上一题