題目鏈結;
題意:
輸入乙個字串,判斷這個字串最多有多少個不同的子串,子串不同要求:子串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 那麼這個點會成為最遠關鍵點對中的乙個。矛盾。所以題目就變成了如何...