51nod 1396還是01串 字首和

2021-08-09 17:23:53 字數 1039 閱讀 5603

1396 還是01串

基準時間限制:1 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題 收藏 關注

給定乙個0-1串s,長度為n,下標從0開始,求乙個位置k,滿足0<=k<=n, 並且子串s[0..k - 1]中的0的個數與子串s[k..n - 1]中1的個數相等。 注意:

(1) 如果k = 0, s[0..k - 1]視為空串

(2) 如果k = n, s[k..n - 1]視為空串

(3) 如果存在多個k值,輸處任何乙個都可以

(4) 如果不存在這樣的k值,請輸出-1

input

就一行,包含乙個0-1串s,長度不超過1000000。

output

題目要求的k值

input示例

01output示例1

題解:做過類似的題自然會有經驗的,01串轉化為10進製,進行字首和計算都是常用的技巧。這裡只需要計算字首和pre[ k]代表0-k-1的數字和,那麼如果符合以下的條件就是符合題意的:k-pre[k] == sum-pre[k],sum代表所有的數字之和。

注意點:不能使用cin,會超時。一般輸入量大於1e5的時候就不能使用cin了

**:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 1e6+5;

const int mod = 1e9+7;

const int inf = 1<<30;

const ll llinf = 1e18+999;

int arr[maxn], pre[maxn], sum, i, n;

char in[maxn];

void init( )

{ n = strlen(in);

pre[0] = 0;

for(int i=0; i

51nod 首尾排序法 01

題意 有乙個長度為n的陣列 p1,p2,p3,pnp1,p2,p3,pn 裡面只包含1到n的整數,且每個數字都不一樣。現在要對這個陣列進行從小到大排序,排序的時候只能是把乙個數字拿過來放到陣列末尾或者開頭,問最少要操作幾次才能使得這個陣列從小到大排序 輸入要求 第一行乙個整數n 1 n 100000...

51nod 回文串劃分

哇很好的題.發現在dp中,找到 轉化的一步 列舉這一步非常重要.這題首先是n2的處理出區間回文,一開始我一直想的是dp i j 來代表 i,j 之間最少劃分幾個,這個是容易的,但是會t,我想了幾個優化,其中乙個便是不是遍歷i,j中間每乙個點,而是直接選p,i,p 為回文串,這樣可以提高速度,但是仍然...

51nod 1085 揹包問題01

在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000 第2 n 1行,每...