BZOJ4566 HAOI2016 找相同字元

2022-04-29 01:18:06 字數 963 閱讀 3051

bzoj

luogu

首先把兩個串拼在一起跑字尾陣列。中間插入乙個沒有出現過的字元。

求完字尾陣列之後考慮\(o(n^2)\)暴力統計:列舉前乙個串和後乙個串的兩個位置,\(ans+=lcp(i,j)\)。

現在改為把一共\(2n\)個字尾按\(rank\)順序插入,每插入乙個字尾,統計與其不在同乙個串裡的字尾的貢獻。

發現可以單調佇列維護。

自己yy一下就好了。

#include#include#includeusing namespace std;

#define ll long long

const int n = 500005;

char s1[n],s2[n];

int n,n1,n2,a[n],t[n],x[n],y[n],sa[n],rank[n],height[n];

int h1[n],l1[n],h2[n],l2[n],t1,t2;

ll sum1,sum2,ans;

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

void getsa()

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

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

int main()

++t1;h1[t1]=height[i+1];l1[t1]=temp;temp=0;

while (t2&&h2[t2]>=height[i+1])

++t2;h2[t2]=height[i+1];l2[t2]=temp;temp=0;

if (sa[i]<=n1) ++l1[t1],sum1+=height[i+1];

else ++l2[t2],sum2+=height[i+1];

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

return 0;

}

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 找相同字元

time limit 20 sec memory limit 256 mb給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩 個子串中有乙個位置不同。兩行,兩個字串s1,s2,長度分別為n1,n2。1 n1,n2 200000,字串中只有小寫字母 輸出乙...