有兩個題隊友補的,先安利一波
1005 permutation 1 hdu 6628
題意:給你乙個n和k,求n的全排列中,相鄰兩數的差值的陣列字典序第k小的排列
思路:其實就是兩個字,暴力.......
字典序第k小,k的範圍是n!跟10000取min,8!=40320,是第乙個大於10000的數,所以當n小於等於8時,使用next_permutation函式暴力找到,再按照差值排個序就好了
對於n大於8的情況因為只需要10000位,所以只需要全排列8個位子的數字就好了,由於差值字典序最小,那麼我們把n放第一位,剩下的從1到n-9這些數字在n後邊依次放好即可,最後把n-8到n-1這個8個數全排列一下找到第k個即可
t組詢問,擔心超時可以先預處理把他們都存起來,最後直接查詢就ok了
#includeusing namespace std;
#define ll long long
struct node
{ int a[50005][15];
struct node{
int z[15],pos;
bool operator < (const node &x)const{
for(int i=1;i<=7;i++){
if(z[i]!=x.z[i]) return z[i]1006 string matching hdu 6629
題意:給你乙個字串,問從第1個字元(下標從0開始)到第n-1個字元開始求與原字串求最長字首時需要比較的次數
思路:這是乙個exkmp模板題,exkmp可以求出乙個字串的每乙個字元開始與另乙個字串的最長公共字首長度,那麼我們可以將他本身跟自己做exkmp演算法,求出最長字首長度,去掉第一位的字首,就接近答案了,接近......那麼還差哪些呢,我們求得是比較次數,相同的比較,ans++,那麼不相等的也要比較,ans++,(那不是每個字首長度+1就好了???當然不是)如果我的字串都比到最後一位了,還相等,那這種情況跳出,就不需要去多判一次了,所以我們再累加的時候只需要判斷字首長度+當前位置-1是不是==字串長度即可
#include#include#include#include#include#includeusing namespace std;
#define ll long long
char sa[1100000],sb[1100000];
int lena,lenb;
int p[1100000],ex[1100000];
//p陣列是用來讓b串自己匹配自己的
void exkmp()
{ p[1]=lenb;
int x=1;
while(sb[x]==sb[x+1]&&x+1<=lenb) x++;//因為我們p[1]是具有一定性,所以我們不能直接用,所以要先暴力求出p[2]
p[2]=x-1;
int k=2;
for(int i=3;i<=lenb;i++)
{int pp=k+p[k]-1,l=p[i-k+1];//pp實際上是p
if(i+l
2019杭電多校第五場補題
1001 fraction bx a mod p 可以轉換為 bx kp a.因為a的範圍是 0,b 則列出不等式 又因為1p x b k p x 1 frac frac frac xp k b x 1p 據說是乙個經典問題 給你a,b,c,d,求最簡分式x y frac yx 滿足a b x y ...
20190805杭電多校第五場
1004 equation 做法很簡單,寫起來容易混。首先想到去絕對值。因為滿足a 0,顯然當x增大時ax b的值也在增大,所以可以對所有 a,b 按 顯然存在n 1個區間,每個區間都可以將式子分為兩部分,前半部分均為 ax b,後半部分均為ax b。區間依次為 預處理a和b的負的字首和與正的字尾和...
2020杭電多校第五場題解
施工中。已知 a times b times c 的四面體,以 a 為 x 軸,b 為 y 軸,c 為 z 軸 以 z 為軸做切面,為 c times frac 的三角形 則易知 h frac frac frac frac frac o n log n 求 frac 的期望即可 比賽時一發過。inc...