2019牛客多校第四場 字尾陣列 回文樹

2021-09-25 19:49:57 字數 1085 閱讀 7727

題目鏈結;

題意:

輸入乙個字串,判斷這個字串最多有多少個不同的子串,子串不同要求:子串a 不等於 子串b ,子串a 不等於 子串b的反轉串。

字串長度小於2e5

樣例:

輸入:

abac

輸出:

說明:

the set of following substrings is such a choice: abac,b,a,ab,aba,bac,ac,c.

字尾陣列中的height陣列之和就是字串中有多少個重複的子串,字串長度為n,就有n*(n+1)/2個子串,

用字尾陣列求出字串s和字串s的反轉串 總共有多少不同的子串,加上字串s中不同回文串的個數。除以2就是答案。

求字串中有多少不同的回文串是回文樹板子題

#includeusing namespace std;

typedef long long ll;

const int maxn=4e5+5;

const int alp=26;

int sa[maxn],rank[maxn],rank2[maxn],height[maxn],cnt[maxn],*x,*y,mxx[maxn];

char s[maxn];

struct palindromic_tree

void init()

int get_fail(int x)

void add(int c)

last = son[cur][c];

cnt[last]++; //表示當前節點訪問了一次

}void count()

}a;void radix_sort(int n,int m)

void get_sa(char s,int n)

for(int i=0;i}void get_height(char s,int n)

}int main()

2019牛客多校第四場 D triples I

對於二進位制每一位上的1進行考慮,2 0 3 1 2 1 3 2 2 2 3 1 2 3 3 2 那麼我們可以想到把a轉化為二進位制,然後他 3 1的位數有cnt1個,3 2的位數有cnt2個。我們可以想到每個數字最多由2個數字組成,下面給出證明。那麼 sum a 3,如果sum 0,那麼直接乙個數...

2019牛客多校第四場 A meeting

考場上寫了一大坨樹形dp,寫的時候就感覺我這不是跟求樹的最長鏈寫的一毛一樣 然後考後看題解,果然是k個ren所連成的子樹的最長鏈的一半 可以利用反證法證明,如果在長度為d的最長鏈的中間放乙個中心,如果有另外乙個點到這個點的長度 d 1 2,那麼這個點到對面的那個點的長度大於d,所以不存在這樣乙個點。...

2019牛客多校第四場A K

a.給你一張n個點n 1條邊的圖,和k個關鍵點。求乙個點到所有關鍵點距離最大值的最小為多少。乍一看像是對答案二分,但是考慮兩個相距最遠的關鍵點,假設他們的距離為d,那麼答案肯定為 d 1 2 如果有一點到中心點的距離超過了 d 1 2 那麼這個點會成為最遠關鍵點對中的乙個。矛盾。所以題目就變成了如何...