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 這時候找到了這個字首的最長公共字尾,然...