2019牛客多校第六場C(PAM)

2021-09-29 11:31:56 字數 1224 閱讀 2352

傳送門

不會pam,建議看一下該部落格pam

維護乙個陣列,表示節點對於答案的貢獻

那麼如何計算這個值呢,首先我們需要知道它是由誰轉移而來的,比如該節點表示的是aabbbbaa,他是由abbbba轉移而來的,我們在計算aabbbbaa時首先要加上abbbba,然後還有一些fail邊連向的點首先我們來看對於aabbbbaa這個節點有貢獻的串的個數,abbbba是乙個,然後就是對abbbba有貢獻,肯定也對aabbbbaa用貢獻(他們分別是bb,bbbb和b、a)這裡我們區分bb、bbbb和a和b為三種,為什麼麼這麼分呢,因為第一種是通過next轉移來的,第二種是其fail邊向上遍歷來的,第三種是之前轉移向他的節點的fail。然後我們再來看aabbbbaa如果按fail邊跑,求出的為aa,a顯然a已經計算過了,如果再加上這個值,就重複了,所以我們在dfs的時候,要對沿fail邊跑的節點打標記,回溯的時候把標記消除。

#include

#define pb push_back

#define vi vector

using

namespace std;

typedef

long

long ll;

const

int n=

1e5+50;

const

int maxn=

5e6+50;

struct palindromic_tree

void

init()

intget_fail

(int x)

void

add(

int c)

last=next[cur]

[c];

cnt[last]++;

}void

count()

}pam;

char s[n]

;ll ans;

int vis[n]

,dp[n]

;int

get(

int x)

return ret;

}void

clear

(int x,

int ret)

}void

dfs(

int x,

int y)

clear

(x,ret);}

intmain()

return0;

}

牛客多校第六場

d 題意感覺說的不是很清楚,一開始題意弄錯了,以為是最優的方案,結果是對於每個盒子這個 so clever 的人的做法是優先選擇盡可能大的物品裝完乙個盒子,我就不知道這個人 聰明了。思路 賽後知道題意後,5分鐘寫完,瞎暴力就一發過了,我自己都有點出乎意料真水了。includeusing namesp...

2020牛客多校第六場 K

題意 判斷給的序列是不是 任意1 n的全排拼接成序列的連續子串行 每乙個數字應該屬於的地方它只能出現一次。從任意點i開始,如果某個點在往後查詢的時候出現了兩次,那麼i點最多能夠延伸到那個地方。然後我們可以把每個點求一下最多能延伸到哪個點,直接記錄len。操作看 處理 由於k很大,可以到1e9,但是n...

2019 杭電多校(第六場)

1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...