統計字首個數,一想到字串的字首,我們就應該想到字典樹,這個和字典一樣的字首樹.
這道題目是字典樹模板的略微改動,我們發現這道題目和一般字典樹的查詢不一樣,字典樹一般查詢是看這個字串是否出現,而這道題目這是統計這個字串出現的次數.
#includeusingnamespace
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]).
#includeusingnamespace
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,十分相似,但是之前這道題的水平面是已經確定好了,
那麼這道題目是不是也可以這麼做呢?我們可以列舉水平面,看每乙個平面上的最大值即可.
#includeusingnamespace
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#includeusing
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...