BZOJ4566 Haoi2016 找相同字元

2022-07-28 02:57:07 字數 1096 閱讀 2201

time limit: 20 sec  memory limit: 256 mb

submit: 1354  solved: 795

[submit][status][discuss]

給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩

個子串中有乙個位置不同。

兩行,兩個字串s1,s2,長度分別為n1,n2。1 <=n1, n2<= 200000,字串中只有小寫字母

輸出乙個整數表示答案

aabb

bbaa

10[submit][status][discuss]

題解:這種題首先很套路,只有兩個串肯定只給乙個建字尾自動機乙個去在上面跑。跑的方式就是跟ac自動機那樣,有就走否則就跳字尾link。然後對每個匹配到的位置g[now]++。由於這題也需要拓撲排序,這裡就是sam的性質,sr[sr[a].link].len

#include#define pb push_back

#define mp make_pair

#define ll long long

using namespace std;

const int maxn=4e5+100;

char s[maxn],s1[maxn];

struct str

sr[maxn];

int cnt=1,last=1;

int siz[maxn],c[maxn],a[maxn];

ll dp[maxn];

ll f[maxn];

ll g[maxn];

void extend(int c)

}//siz[np]=1;

}int main()

g[now]++;

ans+=1ll*(tmp-sr[sr[now].ff].len)*siz[now];

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

for(int i=1;i<=cnt;i++)ans+=1ll*(sr[i].len-sr[sr[i].ff].len)*siz[i]*f[i];

cout<}

bzoj4566 HAOI2016 找相同字元

time limit 20 sec memory limit 256 mb submit 113 solved 64 submit status discuss description 給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩 個子串中有乙個位...

BZOJ4566 Haoi2016 找相同字元

bzoj4566 haoi2016 找相同字元 給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩個子串中有乙個位置不同。兩行,兩個字串s1,s2,長度分別為n1,n2。1 n1,n2 200000,字串中只有小寫字母 輸出乙個整數表示答案 aabb b...

BZOJ4566 HAOI2016 找相同字元

bzoj luogu 首先把兩個串拼在一起跑字尾陣列。中間插入乙個沒有出現過的字元。求完字尾陣列之後考慮 o n 2 暴力統計 列舉前乙個串和後乙個串的兩個位置,ans lcp i,j 現在改為把一共 2n 個字尾按 rank 順序插入,每插入乙個字尾,統計與其不在同乙個串裡的字尾的貢獻。發現可以單...