Contest1030 - 2017级新生周赛(三)D

1323 Problem  D

题目描述

“与我签订契约,成为魔法少女吧!”。QB这个无耻老贼又在世界各地搞传销了。

某一天我们的圆神终于决定要把QB封印起来了,可是普通的魔法对QB来说是没有用的。于是圆神来到学院都市,找到了呱太医生,呱太医生通过研究,发现QB的构造与人工智能惊人的相似。于是创造出了封印QB的方法。

具体方法是这样的:首先你需要把QB抓过来(笑)。然后通过计算机向QB输入一串由01构成的机器代码,重构QB脑中的意识。可是有一个很严重的问题,就是在输入的代码中,有一个关键位置十分容易被QB现存的意识破坏掉,所以呱太医生必须找到这个位置让圆神为其添加一层护盾,现在呱太医生将这个任务交给了你,你能帮呱太医生找出这个关键位置,拯救世界吗?

那么什么位置算是关键位置呢?,呱太医生告诉说,如果我们吧01串从某个位置分开成两个串,我们把前面的串叫串1,后面的那个叫串2。如果串1中0的个数,等于串2中1的个数。那么这个位置就是关键位置。

注意:因为关键位置没有下标,这里我们用串1最后一个数字的下标来代替表示关键位置(原始01机器代码的下标从1开始),如果觉得我没讲明白的话就看样例和下面的Hint

输入

第一行, 一个n,01串的长度

数据范围:(2 <= n <= 1000000)

第二行,一个01串s

输出

一个数,第一个串最后一个数字的下标

样例输入

9
000010111

样例输出

4

提示

样例:这个串可以从关键位置分割成两个串,串1:0000, 串2:10111,为了方便表示关键位置,我们用第一个串的最后一个数字的下标代替关键位置输出。所以输出串1中最后一个0的位置,也就是4。
特殊的:如果一个串中没有出现过1(比如串:0000),请输出0.

import java.util.Scanner;

public class Chuan {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Scanner sc2 = new Scanner(System.in);
		
		int n = sc.nextInt();
		String s = sc2.nextLine();
		
		int a[] = new int[n];
		int b[] = new int[n];
		
		if(s.charAt(0)=='0')
			a[0] = 1;
		else
			b[0] = 1;
		for (int i = 1; i < n; i++) {
			if(s.charAt(i)=='0') {
				a[i] = a[i-1] + 1;
				b[i] = a[i-1];
			}else {
				a[i] = a[i-1];
				b[i] = b[i-1] + 1;
			}
		}
		
		for (int i = 0; i < b.length; i++) {
			if(a[i]==b[n-1]-b[i]) {
				System.out.println(i+1);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39507723/article/details/83473260
今日推荐