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 順序插入,每插入乙個字尾,統計與其不在同乙個串裡的字尾的貢獻。發現可以單...