小 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 以此類推,找到這些狀態,就...