luogu1117 優秀的拆分 字尾陣列

2022-04-29 20:51:09 字數 1334 閱讀 9153

考慮分別計算每個位置作為aa的末尾或者bb的開頭的個數 最後乘一乘就是答案

據說是套路的計算aa的方法:

首先列舉a的長度l,然後每l個字元當做乙個關鍵點,這樣的話,乙個aa包含且只包含相鄰兩個關鍵點(記為a,b),而且滿足lcp(a,b)+lcs(a,b)-1>=l 手畫一下就能看出來

於是sa搞lcp 倒過來再sa搞lcs 最後差分一下統計答案即可

1 #include2

#define pa pair3

#define clr(a,x) memset(a,x,sizeof(a))

4#define mp make_pair

5using

namespace

std;

6 typedef long

long

ll;7

const

int maxn=3e4+10;8

9 inline char

gc()

14inline ll rd()

17while(c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+c-'

0',c=gc();

18return neg?(~x+1

):x;19}

2021

char

str[maxn];

22int

lg2[maxn],n;

2324

struct

sam=j;49}

5051 hei[1]=0;52

for(i=1,j=0;i<=n;i++)

59//

for(i=1;i<=n;i++) printf("hei:%d %d ; rnk:%d ; sa:%d \n",i,hei[i],rnk[i],sa[i]);

60for(i=n;i;i--)65}

66}6768 inline int query(int x,int y)

75}fw,bw;

7677

intend[maxn],beg[maxn];

7879

intmain()

101}

102}

103for(i=1;i<=n;i++) end[i]+=end[i-1],beg[i]+=beg[i-1

];104 ll ans=0

;105

for(i=1;i)

108 printf("

%lld\n

",ans);

109}

110return0;

111 }

字串hash 洛谷P1117 優秀的拆分

這裡講一95分的演算法 就是用字串hash取搞 怎麼弄呢?我們列舉aa 所有的aa 用字串hash取判斷a和a是否相同 然後記錄aa的開頭位置和結尾位置 然後乘法原理統計答案就好了 include define pow define ll long long using namespace std ...

優秀的拆分(power)

1 include2 using namespace std 3int main 417 18return0 19 舉例說明1 14 的可以最優拆分為 8 4 2 14的二進位制1110 8 的二進位制1000 與14按位 結果為1000 8 非0 4 的二進位制0100 與14按位 結果為0100...

bzoj 4650 優秀的拆分

先給大家安利乙個80分 小學生都會寫的 版本 分析 複雜度o n 3 在洛谷上測一下可以過80分 特判懶得寫,加上就90了 g i j 表示i到j之間能否構成 aa 的形式,暴力就可以出來 然後枚舉子序列長度,起點位置,以及斷點位置與起點的長度,就能找出 aabb 中a與b接壤的位置,然後左邊右邊都...