題目鏈結
題意:給你乙個字串,對於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...