寒假集訓二補題與題解

2022-09-19 03:00:11 字數 3545 閱讀 3436

統計字首個數,一想到字串的字首,我們就應該想到字典樹,這個和字典一樣的字首樹.

這道題目是字典樹模板的略微改動,我們發現這道題目和一般字典樹的查詢不一樣,字典樹一般查詢是看這個字串是否出現,而這道題目這是統計這個字串出現的次數.

#includeusing

namespace

std;

const

int n=1000010

;int

n,m,idx;

int son[n][26

],cnt[n];

char

str[n];

//插入乙個字串

void

insert()

cnt[p] ++;}//

查詢字串出現的次數

intquery()

return

res;

}int

main()

while(m--)

return0;

}

對字串s自己匹配求出next陣列,然後根據定義,對於每乙個i,s[i-next[i]+1~i]與s[1~next[i]]是相等的,而且不存在更大的next值滿足條件.具體證明可以看李煜東金牌爺的《演算法競賽高階指南》

既然如此的話,那麼我們發現當i-next[i]能夠整除i時候,那麼s[1~i-next[i]]就是s[i-1]的最小迴圈元,至於次數那麼也就是i/(i-next[i]).

#includeusing

namespace

std;

const

int n=1e6+10

;int

ne[n],n,m,i,j,len,cnt;

char

a[n];

void

calc_ne()

}int

main()

return0;

}

我們發現這道題目,要求我們算出哈夫曼編碼,也就是最短不重疊字首的編碼,那麼我們就可以用上trie字典樹的性質配合哈夫曼樹進行處理.

哈夫曼樹,就是滿足權值*路徑長度最短的樹,因此我們這道題目直接可以開哈夫曼樹處理即可,**很清晰.

#include#include

#include

using

namespace

std;

#define pll pairconst

int n=101000

;long

long

n,m,i,j,k,ans,x;

priority_queue

,greater>p;

intmain()

while((p.size()-1)%(k-1)!=0

) p.push(pll(

0,0));

while(p.size()>=k)

p.push(make_pair(temp,deep+1

)); ans+=temp;

}cout

return0;

}

經典哈夫曼樹的模型,每次合併重量最小的兩堆果子即可。使用小根堆維護所有果子,每次彈出堆頂的兩堆果子,並將其合併,合併之後將兩堆重量之和再次插入小根堆中。

#include#include

#include

#include

using

namespace

std;

intmain()

int res=0

;

while(heap.size()>1

)

cout

return0;

}

首先我們觀察這道題目其實和之前的e題largest rectangle in a histogram,十分相似,但是之前這道題的水平面是已經確定好了,

那麼這道題目是不是也可以這麼做呢?我們可以列舉水平面,看每乙個平面上的最大值即可.

#includeusing

namespace

std;

const

int n=1010

;int

n,m;

ints[n][n],l[n],r[n];

intq[n];

int work(int

h)

tt=0

; q[

0]=m+1

;

for(int i=m;i;i--)

int res=0

;

for(int i=1;i<=m;i++)

res=max(res,h[i]*(r[i]-l[i]-1

));

return

res;

}int

main()

int res=0

;

for(int i=1;i<=n;i++) res=max(res,work(s[i]));

cout

<3

}

#include#include

#include

using

namespace

std;

intmain()

sort(s,s+n);

for(int i=1;i)

}if(flag) cout<<"no"

yes"

<}

return0;

}

向這樣的動態求第k小的值,並且k的變化要麼+1 要麼-1 要麼不變的話,就可以用對頂堆資料結構。

當加入乙個數x的話判斷如果大根堆為空或者x >= 小根堆堆頂的話直接加入小根堆中

反之加入到大根堆中,並且把大根堆堆頂的數新增到小根堆中,並把大根堆堆頂刪除

當來到一次get操作

#include#include

using

namespace

std;

const

int n=3e4+10

;priority_queue

q;priority_queue

,greater >q2;

intnum[n],n,m,x;

intmain()

k++;

}cout

int t=q2.top();

q2.pop();

q.push(t);

}return0;

}

寒假集訓一補題與題解

排序 中位數性質 int a 100010 void sort int l,int r return false 如果所有的都不滿足,那麼這個平均數就一定不滿足 int main while r l 1e 5 printf d n int r 1000 return 0 兩邊的牛高 中間的牛矮資料範...

寒假集訓四補題與題解

採摘花生也需要單位1的時間 最後只需退回馬路上即可,不需要返回起點,退回馬路所需的時間即為當前位置的行號 include include includeusing namespace std int n,m,t int bu,sum int a 22 22 struct you hh 22 22 b...

1 28寒假集訓 1(補題)

學不會今天的內容 種樹,只能補補昨天的題了otz 先補了個昨天的g題 竟因沒反應過來priority queue是優先佇列沒有寫qaq太菜了 kattis guessthedatastructure 題意 給n行資料,如果是1就塞進去,2就拿出來,判斷是佇列還是優先佇列還是棧,都不是就輸出impos...