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

2021-08-15 15:42:57 字數 1101 閱讀 3022

bzoj

看到多串處理,sa

就連起來 sa

m???

單串建自動機

然後其他串匹配

對於乙個串建完sa

m 後

另乙個串在sa

m 上匹配

記錄當前匹配的最大長度

匹配了當前位置的話,就能產生一定的貢獻

但是很顯然,沿著pa

rent

往上,所有點都能夠產生貢獻

所以匹配完再沿著pa

rent

做一遍類似dp

的東西算貢獻

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 220000

inline

int read()

struct node

t[max<<1];

int last=1,tot=1;

int size[max<<1];

long

long ans;

int f[max<<1],g[max<<1],a[max<<1],c[max<<1];

char ch[max];

void extend(int c)

}size[np]=1;

}int main()

ans+=1ll*size[now]*(len-t[t[now].ff].len);

g[now]++;

}for(int i=tot;i;--i)f[t[a[i]].ff]+=f[a[i]]+g[a[i]];

for(int i=1;i<=tot;++i)ans+=1ll*size[i]*f[i]*(t[i].len-t[t[i].ff].len);

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

return

0;}

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

bzoj 字尾陣列的做法,應該不是很難想 首先看到兩個不同的串,當然是接在一起求sa hei ght 那麼,考慮一下暴力 在兩個串各列舉乙個字尾,他們的lc p 就是對答案產生的貢獻 現在優化一下,按照sa 的順序列舉來處理lc p 利用乙個單調棧維護一下,每次記錄一下前面有多少個的貢獻和當前答案一...

bzoj4566 找相同字元

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

BZOJ4566 找相同字元 字尾自動機

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