BZOJ4566 找相同字元(字尾陣列)

2021-08-15 15:42:57 字數 1185 閱讀 4703

bzoj

字尾陣列的做法,應該不是很難想

首先看到兩個不同的串,當然是接在一起求sa

,hei

ght

那麼,考慮一下暴力

在兩個串各列舉乙個字尾,他們的lc

p 就是對答案產生的貢獻

現在優化一下,按照sa

的順序列舉來處理lc

p 利用乙個單調棧維護一下,每次記錄一下前面有多少個的貢獻和當前答案一樣就好啦

只是有點難寫。。。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 440000

#define ll long long

int n,gr[max];

int sa[max],hg[max],rk[max];

int a[max],t[max],x[max],y[max];

bool cmp(int i,int j,int k)

void getsa()

for(int i=1;i<=n;++i)rk[sa[i]]=i;

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

}int q1[max],top1,s1[max];

int q2[max],top2,s2[max];

ll ans,sum1,sum2;

char ch[max];

int main()

++top1;s1[top1]=tmp1;q1[top1]=hg[i+1];

ll tmp2=0;

while(top2&&q2[top2]>=hg[i+1])

++top2;s2[top2]=tmp2;q2[top2]=hg[i+1];

if(gr[sa[i]]==1)++s1[top1],sum1+=hg[i+1];

else ++s2[top2],sum2+=hg[i+1];

}printf("%lld\n",ans);

return

0;}

bzoj4566 找相同字元

題意 給定兩個字串,從中各取乙個子串使之相同,有多少種取法。允許本質相同。解 建立廣義字尾自動機,對於每個串,分別統計cnt,之後每個點的cnt乘起來。記得開long long 1 include 2 include 3 include 4 5 typedef long long ll 6 cons...

BZOJ4566 找相同字元(字尾自動機)

bzoj 看到多串處理,sa 就連起來 sa m?單串建自動機 然後其他串匹配 對於乙個串建完sa m 後 另乙個串在sa m 上匹配 記錄當前匹配的最大長度 匹配了當前位置的話,就能產生一定的貢獻 但是很顯然,沿著pa rent 往上,所有點都能夠產生貢獻 所以匹配完再沿著pa rent 做一遍類...

BZOJ4566 找相同字元 字尾自動機

題意 給定兩個字串,求兩個字串相同子串的方案數。分析那麼將字串s1建sam,然後對於s2的每個字首,都在sam中找出來,並且計數就行。我一開始的做法是,建乙個u和len,順著s2跑sam,當st u next c 存在的時候,u st u next c len 這時候找到了這個字首的最長公共字尾,然...