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行,每...