列表

详情


NC230830. 小葱的01串

描述

给定一个长度为偶数的环形 01 字符串。(环形指,第一个字符和最后一个字符是相邻的)
字符串初始每个字符都是白色。小葱想把一段连续区间染成红色,使得红色的字符'0'数量等于白色的字符'0'数量,红色的字符'1'数量等于白色的字符'1'数量。问有多少种不同的染色方法?
两个方案不同当且仅当存在一个某字符,在一个方案是染成红色,在另一个方案为白色。

输入描述

第一行输入一个正整数 n,代表字符串长度。
第二行输入一个长度为 n 的 01 字符串(仅由字符'0'和字符'1'组成的字符串)
数据范围:
。保证 n 是偶数。

输出描述

合法的染色方案数。

示例1

输入:

2
11

输出:

2

说明:

将第一个数字染红为一个方案。
将第二个数字染红为一个方案。

示例2

输入:

4
0101

输出:

4

说明:

任意一个长度为2的区间染红均合法。

示例3

输入:

4
1100

输出:

2

说明:

可以将区间 [2,3] 染红,或者将第一个和最后一个字符染红(因为是个环,所以第一个和最后一个也是相邻区间)。

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 1052K, 提交时间: 2023-04-07 00:29:38

#include<bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    s = " " + s;
    vector<int> fr(n+1);
    for(int i=1;i<=n;i++){
        fr[i] = fr[i-1] + (s[i]=='1');
    }
    int ans = 0;
    for(int i=1;i<=n/2;i++){
        int sum = fr[i+n/2-1] - fr[i-1];
        if(sum*2==fr[n]) ans++;
    }
    ans *= 2;
    cout<<ans<<endl;
}

Python3 解法, 执行用时: 109ms, 内存消耗: 7112K, 提交时间: 2022-12-25 23:59:41

n = int(input())
s = input()
cc, r = 0, n//2
ss = [int(v) for v in s]
if sum(ss) % 2 != 0:
    print(0)
else:
    sums = sum(ss) //2
    ss = ss * 2
    a = sum(ss[:r])
    if a == sums:
            cc += 1       
    for i in range(1,n):
        a += ss[i+r-1] - ss[i-1]
        if a == sums:
            cc += 1
        
    print(cc)
    

C++ 解法, 执行用时: 6ms, 内存消耗: 908K, 提交时间: 2021-11-20 23:01:18

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
char s[N];
int cnt[N];
int main()
{
	int n;
	cin>>n>>s+1;
	for(int i=1;s[i];i++)
	cnt[i]=cnt[i-1]+(s[i]=='1');
	int ans=0;
	if(cnt[n]&1)
	{
		puts("0");
		return 0;
	}
	for(int i=n/2+1;i<=n;i++)
	if(cnt[i]-cnt[i-n/2]==cnt[n]/2)
	ans++;
	printf("%d\n",ans*2);
}

上一题