SDOI2016 模式字串

2022-03-27 00:54:39 字數 1248 閱讀 3892

題目

bzoj第400題留念

這道題如果只有前三組資料的話還是很水的呀,我們完全可以點分

首先我們先倍長那個字串,直到這個字串的長度大於等於\(n\)

我們把這個字串做一遍\(hash\),記下每乙個字首每乙個字尾的\(hash\)值是多少

之後套路點分,對於當前的分治重心找出乙個字首乙個字尾來拼接,由於我們倍長了原串,我們可以方便的直到當前連通塊裡某個點到分治重心的路徑是否能形成乙個字首或乙個字尾,我們開乙個桶記錄一下就好了

之後就只有\(bzoj\)上能過了

**

#include#include#include#include#define re register

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define ull unsigned int

#pragma gcc optimize(3)

inline int read()

const int maxn=1e5+5;

const int inf=999999999;

struct ee[maxn<<1];

int head[maxn],vis[maxn],sum[maxn],mx[maxn],st[maxn],tax[maxn],cl[maxn];

int n,num,case,rt,ss,top,tot,m,len;ll ans=0;

ull ha[maxn],pw[maxn],base=233,pr[maxn],bh[maxn];

char s[maxn],a[maxn],t[maxn];

inline void add(int x,int y)

void getroot(int x,int fa)

mx[x]=max(mx[x],ss-sum[x]);

if(mx[x]}void getpre(int x,int l,ull sh,int fa)

}void getbeh(int x,int l,ull sh,int fa)

}void dfs(int x)

tax[1]=0;

while(tot) tax[cl[tot--]]=0;

for(re int i=head[x];i;i=e[i].nxt)

}inline void work()

int main()

return 0;

}

SDOI2016 數字配對

傳送門 裸費用流。建邊 對於a i a j pr ime a j a i frac prime a j a i a j a i prim e a j a i 需要i ii向j n j nj n連,並且j jj向i n i ni n連。費用即為c i c j c i c j c i c j 流量無窮大...

SDOI2016 數字配對

點此看題 考慮這個條件ai是aj的倍數,且ai aj是乙個質數,滿足這個條件就必須要滿足下面兩個條件 第二個條件很重要,它告訴我們可以把數字的cnt cntcn t奇偶劃分,就能得到乙個二分圖,我們就可以想網路流的方面想,圖是這樣建的 然後我們在建好的圖上跑費用流,由於圖是二分圖,最長路一定是單調遞...

SDOI 2016 數字配對

戳一戳 感覺自己調了半天然後模板打錯了。好難過。rsduheiutfhnesrfnsjkenfkj 不bibi了我們講一下如何建圖。我們可以發現這2個數字之間的關係是雙向的。那我們怎麼辦呢 手動滑稽 這裡有乙個很神奇的結論 如果a為b的因數且b除以a的值為質數,那麼將a與b質因數分解後a與b的指數差...