我們並不需要知道相對應位置的數字是不是相等,只要置換之後的hash值相等就行了。
hash 函式本身相當於每個位置乘上 x 的若干次方,置換之後只要改變次方的順序就好了。
具體來說,設我們的base值是m,一段區間的hash值是∑n
i=0s
i∗mi
∑ i=
0nsi
∗mi,然後乙個置換的hash值是∑n
i=0s
i∗mp
(i) ∑i=
0nsi
∗mp(
i)如果我們設g[
n−i]
=mp(
i)g [n
−i]=
mp(i
),那麼我們要求的置換的hash值是∑n
i=0s
i∗g[
n−i]
∑ i=
0nsi
∗g[n
−i],這是乙個非常明顯的卷積
那麼同理一段區間的hash值也可以通過倒置的方法用卷積求出來,最後只要判斷兩者是不是相等就行了
#include
#include
#include
#define ll long long
using namespace std;
const int n=1500005;
const int mod=998244353;
const int base=131;
int n,m,c,fn,r[n];ll mi[n],hash1[n],hash2[n],s[n],p[n];
ll ksm(ll a,ll k)
void ntt(ll *a,int id)}}
if (id==-1) reverse(a+1,a+n);
}int main()
2018SD省隊集訓R2 D6
這是一道簽到題 考慮入度出度平衡的狀態,我們先把所有的邊減成0,然後考慮對於一條有向邊x y,如果有c個,那麼可以連權值為 w,流量為c的,還要連權值是w,流量為inf的,我們從1跑到n的時候,考慮什麼時候dis t 0的時候就結束了,再走下去不會更優 include include include...
2018SD省隊集訓R1 D1
經過每條邊至少一次並且回到原點,我們可以想到尤拉迴路。發現尤拉迴路的特點是每個點度數為偶數,然後我們的目標就是把度數奇數的那些點通過新增一些長度盡量小的邊變成度數為偶數。新增哪些邊呢?不難想到是最小生成樹上的邊,那我們先新增成最小生成樹,其實就是每條邊可以選 不選,每個點的要求被選的相鄰邊是奇數 偶...
省隊集訓DAY2
假設我們列舉數列中長度為len的區間,那麼如何判斷兩個數列可以匹配呢?對於提取的數列從小到大排序,從大到小排序,然後兩兩配對,如果所有的都滿足 h 那麼就可以匹配。應該算是貪心吧。這樣做的時間複雜度是o n le n loglen 還是上面的思想,我們如何快速判斷呢?假設我們確定了提取出的區間數列,...