CTSC2012 熟悉的文章

2022-03-27 04:56:51 字數 1523 閱讀 4728

題目

好題啊\(sam\)+單調佇列優化\(dp\)

首先這個\(l\)滿足單調性真是非常顯然我們可以直接二分

二分之後套乙個\(dp\)就好了

設\(dp[i]\)表示到達\(i\)位置熟悉的文章的最大長度

有乙個非常顯然的\(dp\)方程

\[dp_i=max\\ (i-j>=mid)

\]同時\([j+1,i]\)這個子串也得是模式串裡的乙個子串

對於上面那個\(dp\)方程,我們把\(i\)提出來,用單調佇列維護一下\(dp_j-j\)的最大值就好了

下面這個限制條件的話,我們可以處理出以\(i\)這個位置的為結尾的和所有的模式串的最長公共子串的長度\(mx[i]\)

這個處理的話我們直接在\(sam\)上過一遍就好了

之後我們就有了第二個限制

\[j>=i-mx[i]

\]經過分析我們可以發現\(i\)每次穩定加\(1\),而\(mx[i]\)每次最多加\(1\),所以\(i-mx[i]\)是單調不降的的

於是我們還是可以用單調佇列來維護

複雜度\(o(tnlogn)\)

**

#include#include#include#include#define maxn 2000010

#define re register

#define ll long long

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

#define min(a,b) ((a)<(b)?(a):(b))

char s[maxn];

int fa[maxn<<1],len[maxn<<1],son[maxn<<1][3];

int mx[maxn];

int q[maxn],dp[maxn];

int t,m,n,cnt=1,lst=1;

inline void ins(int c)

int x=son[f][c];

if(len[f]+1==len[x])

int y=++cnt;

len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;

for(re int i=0;i<3;i++) son[y][i]=son[x][i];

while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];

}inline void query()

while(now&&!son[now][s[i]-'0']) now=fa[now];

if(!now)

l=len[now]+1,mx[i]=l;now=son[now][s[i]-'0']; }}

inline int check(int mid)

if(dp[n]*10>=n*9) return 1;

return 0;

}int main()

while(t--)

printf("%d\n",ans);

} return 0;

}

CTSC2012 熟悉的文章

哈哈哈哈第一次做ctsc的題超開心,感覺一下子就有檔次了許多。這題的資料範圍對我這種不會算空間的蒟蒻就是個迷。對於 100 的測試資料,輸入檔案的長度不超過 1100000 位元組 呵。做法 把所有作文庫連起來,每兩個中間用2隔開建sam 作文串在sam上跑一跑,計算出以每乙個位置為結尾,最多能匹配...

ctsc2010 星際旅行

題意很簡單 給定一棵樹,問從根分別走到每個節點的最長路程,其中每個點給定lim,即最多從該點出發lim次,保證lim大於等於該點的度數。特別 鳴謝 ldl在他的模擬題中出了這道題。當題解講這要用樹形dp解網路流模型時,都被驚異了,完全沒有想到網路流,也完全沒有必要網路流,atm在考場上直接有樹形dp...

CTSC2018 混合果汁

為何要用整體二分,整體二分應該怎樣二分,和 poi2011 met meteors十分相像,這裡就不再重複。那麼對於乙個顧客來講,如果當前的區間總份數小於他想要的份數,或者是區間最小 大於他能接受的最大 就把該顧客劃分到右區間,如若滿足則劃分到左區間。想要和 poi2011 met meteors一...