洛谷3498 BZOJ2081 Beads 雜湊

2021-08-27 03:30:53 字數 878 閱讀 9874

題目鏈結

題意:給你乙個字串,對於i∈[

1,n]

i\in[1,n]

i∈[1,n

]判斷每i個連續字元一組,組成若干個子串,最多能得到多少個不同的子串?最後餘下的不夠i

ii的部分忽略。並且我們認為正序和倒序是相同的,例如認為(1,2)和(2,1)相同的。輸出最多得到不同子串的個數、有多少個k能得到這麼多、這些最長序列都是由哪些i得來的。

題解:用雜湊字首和來判斷相同不難想到,但是發現這個認為正序和倒序是相同不太好辦,乙個想法是對雜湊的正序和倒序字首和再雜湊,但是每次都memset複雜度也**了,所以考慮用map這種清空速度很快的東西,順便也可以當雜湊表。我們的做法是把這段的雜湊值相乘之後扔進map,來判斷這個區間有沒有出現過。

重點就是如何用雜湊判斷乙個區間正著看和反著看是否是相同的。

**:

#include using namespace std;

unsigned long long m[200010],h1[200010],h2[200010],a[200010],c=19260817;

int n,ans,cur;

mapmp;

vectorb;

inline unsigned long long geth(int x,int y)

int main()

} if(cur>ans)

else if(ans==cur)

b.push_back(i);

} printf("%d %lu\n",ans,b.size());

for(int i=0;iprintf("%d ",b[i]);

printf("\n");

return 0;

}

洛谷 P2709 BZOJ 3781 小B的詢問

小b有乙個序列,包含n個1 k之間的整數。他一共有m個詢問,每個詢問給定乙個區間 l.r 求 sum 1 kc i 2 的值,其中 c i 表示數字i在 l.r 中的重複次數。小b請你幫助他回答詢問。輸入格式 第一行,三個整數n m k。第二行,n個整數,表示小b的序列。接下來的m行,每行兩個整數l...

洛谷 2709 小B的詢問

題目描述 小b有乙個序列,包含n個1 k之間的整數。他一共有m個詢問,每個詢問給定乙個區間 l r 求 c i 2 sum c i 2 c i 2 的值,其中i的值從1到k,其中c i 表示數字i在 l r 中的重複次數。小b請你幫助他回答詢問。輸入格式 第一行,三個整數n m k。第二行,n個整數...

洛谷 3512 bzoj 2096 題解

題外話 bzoj2096現在找不到了。要交還是上洛谷。給定n,k和乙個長度為n的序列,求最長的最大值最小值相差不超過k的連續序列 翻譯的很清楚 輸入 3 9 5 1 3 5 8 6 6 9 10 輸出 4 解釋 5 8 6 6 和 8 6 6 9都是正確的 線段樹 二分長度好像珂以做,但是只能拿80...