字首和(狼和野牛)

2022-06-09 10:09:08 字數 2112 閱讀 8026

位於歐洲中部的赫希費爾登狩獵保護區生活著許多動物,雄壯的野牛和**的狼群之間保持著一種平衡,當野牛的數量和狼群一樣多時,它們彼此互不侵犯相安無事,但只要狼的數量多於野牛狼群就會攻擊牛群,而野牛數量占多數時,它們會驅逐狼群到別的地方。

當地的統計學家把牛群和狼群分布通過0和1表示為乙個字串s,s的字串可以表示乙個區域內的牛和狼總數,請你根據這個統計字串,判斷出來這個保護區內能共存最多頭野牛和狼的區域,該區域的牛群和狼群總數是多少。

輸入乙個字串,只包含01,長度不超過1000000。

輸出

一行乙個整數,最長的0與1的個數相等的子串的長度。

樣例輸入 copy

1011

樣例輸出 copy

2

提示1. 樣例解釋

對於1011而言,它表示保護區內分布情況為:[牛,狼,牛,牛]

那麼最多只有[狼,牛]這2只動物存在於某個區域內,所以結果為2

2. 資料範圍

對於10%的資料,字串長度≤10;

對於100%的資料,字串長度≤1000000。

題目大意:就是找乙個字串中的最長字串(字串要滿足01相等)

解析:

把0看成-1,把1看成+1,則乙個子串可以選當且僅當這個串裡(區間)的數字之和為0。區間和可

以表

示成兩個字首和的差,而兩個字首和的差為0即兩個字首和相等,記錄字首和為x的最早出現位置

f[x],

對於乙個字首和s[i],如果f[s[i]]則第f[s[i]]+1個字元到第i個字元組成的串就是乙個合法解,且比它短

的解不會計入答案,用這個長度更新答案即可

就是找字首和為0,或者字首和相等中間夾著的。(……3……3……)兩個3中間的,或者是(……0……)就是0前面的。

ac**1:(用mp標記字首和)

#pragma gcc optimize(2)#include

using

namespace

std;

inline

int read()

typedef

long

long

ll;const

int maxn = 1e7+100

;char

a[maxn];

intsum[maxn];

unordered_map

mp;intmain()

if(a[i]=='1'

) }

int ans=0

;

for(int i=1;i<=t;i++)

else

ans=max(ans,i-mp[sum[i]]);

}printf("%d

",ans);

return0;

}

ac**2:陣列標記:

#pragma gcc optimize(2)#include

using

namespace

std;

inline

int read()

typedef

long

long

ll;const

int maxn = 1e7+10

;char

a[maxn];

intvis[maxn];

intmain()

if(a[i]=='1'

)

if(sum!=t&&vis[sum]==0

)

else

}printf(

"%d\n

",ans);

return0;

}

字首和演算法 一維字首和 二維字首和

輸入乙個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l,r。對於每個詢問,輸出原序列中從第l個數到第r個數的和。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數,表示整數數列。接下來m行,每行包含兩個整數l和r,表示乙個詢問的區間範圍。輸出格式 共m行,每行輸出乙個詢問的結果。資...

字首和 (1)什麼是字首和和一維字首和

字首和 prefix sum 的定義為 對於乙個給定的數列 a,它的字首和數列 s 是通過遞推能求出來得 例如 假設陣列a和字首和陣列s都已經定義 int i 初始條件 a 0 0 s 0 0 for i 1 i n i 下面我們用乙個模板題,將完整的一維陣列字首和做乙個簡單的展示。題目鏈結 inc...

問題1222狼和兔子

問題描述 有一座周圍有n個洞的小山。孔從0到n 1有符號。兔子必須藏在其中乙個洞中。狼以逆時針方向搜尋兔子。他進入的第乙個洞是乙個用0簽名的洞。然後,他將每m個洞進入乙個洞。例如,m 2和n 6,狼將進入有符號0,2,4,0的孔。如果兔子躲在標有1,3或5的孔中,它將存活。因此,我們將這些漏洞稱為安...