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 */