位於歐洲中部的赫希費爾登狩獵保護區生活著許多動物,雄壯的野牛和**的狼群之間保持著一種平衡,當野牛的數量和狼群一樣多時,它們彼此互不侵犯相安無事,但只要狼的數量多於野牛狼群就會攻擊牛群,而野牛數量占多數時,它們會驅逐狼群到別的地方。當地的統計學家把牛群和狼群分布通過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)#includeusing
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)#includeusing
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的孔中,它將存活。因此,我們將這些漏洞稱為安...