NC218215. 加密
描述
对于一个长度为 n 的 01 串,我们定义他的权重是该串内极长的全 1 子串的数量。这里“极长”指“无法再向两侧延伸”。
输入描述
第一行一个 01 串,表示需要操作的串。
输出描述
一行一个整数,表示求得的答案。
示例1
输入:
11000110
输出:
2
说明:
原串有两个极长全 1 子串,分别是 [1,2] 和 [6,7]。可以发现,无论反转哪个位置,得到的串依然有两个极长全 1 子串。示例2
输入:
11001011
输出:
2
说明:
原串有三个极长全 1 子串,分别是 [1,2], [5] 和 [7,8]。如果反转位置 6,得到的串是 11001111,有两个极长全 1 子串。C(clang11) 解法, 执行用时: 10ms, 内存消耗: 2056K, 提交时间: 2021-04-14 20:15:08
#include<stdio.h> #include<string.h> int main() { char ch[1000000]; gets(ch); int i,j=0,t=0,k=0,count=0; for(i=0;i<strlen(ch);i++) { if(ch[i]=='1') { count++; if(i-j==1) { t=1; } k=i; while(ch[i]=='1') { i++; } if(i-k==1) { t=1; } j=i; } } printf("%d\n",count-t); return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 128ms, 内存消耗: 54396K, 提交时间: 2021-04-09 19:59:50
s = input().split('0') ans = sum([1 if len(i) > 0 else 0 for i in s]) for i in range(len(s) - 1): if len(s[i]) > 0 and len(s[i + 1]) > 0: ans -= 1 break if len(s[i]) == 1 or len(s[i + 1]) == 1: ans -= 1 break print(ans)
C++(clang++11) 解法, 执行用时: 55ms, 内存消耗: 504K, 提交时间: 2021-04-21 16:08:37
#include <stdio.h> int n, m, i, j, k, p, x=5, y; int main(){ while(scanf("%1d", &k) == 1){ if(k && !p) n++; if(k^p) m |= x==1 || y==1; p = k; if(!k) x++, y = 0; else x = 0, y++; } m |= y == 1; printf("%d\n", n-m); return 0; }
Python3(3.9) 解法, 执行用时: 105ms, 内存消耗: 17940K, 提交时间: 2021-05-18 19:59:01
s = input() import re a = re.findall('1+', s) b = re.findall('0',s.strip('0')) x = len(a)-1 if '1' in a or b else len(a) print(x)