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,字串中只有小寫字母 輸出乙...