弱校聯盟con 7 失戀得小T(字尾陣列)

2021-07-31 11:57:20 字數 1392 閱讀 1785

小 t 最近失戀了,開始懷疑人生和愛情,他想知道在這世界中去偽存真後還剩多少。

小 t 在網上拿到了代表大千世界的長字串,刪掉了所有換行空格和標點符號,只剩下了小寫字母。

現在字串中有好多重複的子串,相同子串裡只有乙個是 real 的。

為了讓小 t 走出失戀,你一定要告訴他這個世界上 real 的東西有多少。

(子串:串中任意個連續的字元組成的子串行稱為該串的子串)

就是問有多少個不同得子串

子串就是所有字尾的所有字首,基於這個思想,考慮字尾陣列得height陣列,每兩個排名相鄰得字尾得最長公共字首,兩個字尾得差就是中間得一段字串咯,他出現過的話,個數就是公共字首長度,比如aabab,ab和abab兩個字尾,公共部分是ab,代表子串ab和a是重複的,最後得ans就是所有子串-height裡面得和。(如果是ababab那麼ababab和abab和ab說白了就是a ab aba abab前兩個字尾得字首夠出得子串中這四個是重複的,ab和abab是a ab是重複的,用不用算ababab和ab呢,不用,因為已經剪掉了後面出現得,不能減兩次甚至更多)

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1e6+10;

int n;

char a[maxn];

typedef pair pii;

int a[maxn],b[maxn];

int realrank[maxn],k;

pii st[maxn];

int s[maxn][2];

long

long h[maxn];

int k;

int c[maxn],d[maxn];

void init()

sort(st+1,st+1+n);

k = realrank[st[1].second] = 1;

for(int i = 2; i <= n ; i++)

}void suffix_array()

for(int j = 1; j <= n ;j++)

a[j] += a[j-1],b[j] += b[j-1];

for(int j = n ; j >= 1; j--)

for(int j = n ; j >=1; j--)

k = realrank[d[1]] = 1;

for(int j = 2 ; j <= n ; j++)

}}void gethigh()

printf("%d\n",n*(n+1)/2-aa);

}int main()

}

弱校聯盟10 3

problem a。best matched pair 找出最大的每一位遞增1的一對乘積,n 2 列舉 includeusing namespace std int n,a 2000 ans 1 bool ck int a return1 int main problem b。help the pr...

多校聯盟 con1 數學題

現在有兩個陣列 a b 所有a裡的元素 所有b裡面的元素中第k大的是什麼 二分答案,檢驗有沒有k 1個比他大的時候,排序兩個陣列 可使用雙指標,乙個從a陣列最後開始,乙個從b陣列最後乙個開始,如果這個比當前的答案大,那麼b陣列前面的,分母減小,比值肯定都大於答案,直接 m個,如果比答案小,減小b的值...

Parentheses(弱校聯盟十一專場)字典序

question 題目詳情 d題 題目大意 稱為平衡的,平衡裡面巢狀平衡也是平衡的,現在給你乙個數,要求你輸出乙個最短字串經過移動這麼多步就可以達到平衡狀態 而且這個字串的字典序最小,規定 的字典序小於 解題思路 經過我們一番推導會發現找到一些狀態,例如 1 3 6 10 以此類推,找到這些狀態,就...