NC230830. 小葱的01串
描述
输入描述
第一行输入一个正整数 ,代表字符串长度。
第二行输入一个长度为 的 01 字符串(仅由字符'0'和字符'1'组成的字符串)
数据范围:
。保证 是偶数。
输出描述
合法的染色方案数。
示例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); }