傳送門
不會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...