LG P3181 HAOI2016 找相同字元

2022-06-12 12:33:09 字數 1275 閱讀 8775

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

題中所求即為a串與b串任意一組height之和,所以暴力可以做到$o(n^2)$

考慮將答案掛在這兩組字尾中sa值較大的那個上,即每個字尾只考慮出現在它前的所有字尾貢獻的答案

由於lcp長度為在這兩排名間height的最小值,可以按排名列舉字尾,單調棧維護答案

可以做到$o(n \log n)$或$o(n)$

#include#include

#include

#include

using

namespace

std;

int n,m=127,len1,len2,buc[400010],x[400010],y[400010],sa[400010],rk[400010],height[400010],sum[400010

];long

long

ans;

char s[400010],s2[200005

];struct

node

;stack

sta;

inline

intread()

while(ch>='

0'&&ch<='

9')w=(w<<1)+(w<<3)+ch-'

0',ch=getchar();

return w*f;

}void

getsa()

}void

getheight()

}int

main()

);

for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(sa[i]<=len1);

for(int i=2;i<=n;i++)

);if(sa[i]>len1+1) ans+=sta.top().val;

}while

(sta.size()) sta.pop();

sta.push((node));

for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(sa[i]>len1+1

);

for(int i=2;i<=n;i++)

);if(sa[i]<=len1) ans+=sta.top().val;

}printf(

"%lld\n

",ans);

return0;

}

[haoi2016]找相同字元

lgP3731 HAOI2017 新型城市化

題意 有多少條,一定被包含在最大匹配裡面 sol.60分,斷掉每一條邊,看是否任然滿流,若不滿流,則必須出現在最大匹配裡面 考慮滿分做法 直接如果一條邊,在殘餘網路的乙個強連通分量裡面,是可以不選的 就做完了 include define maxn 10005 define maxm 200005 ...

HAOI2016 找相同字元

給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩個子串中有乙個位置不同。兩行,兩個字串s1,s2,長度分別為n1,n2。1 n1,n2 200000,字串中只有小寫字母 題解 s1 s2拼起來。求height 要求 i j lcp rk i rk j ...

HAOI2016 找相同字元

其實這道題跟 ahoi2013 差異很像 其實這個問題的本質就是讓你算所有字尾的 lcp 長度之和,但是得來自兩個不同的字串 先把兩個字串拼起來做一遍 sa 由於我們多算了來自於同乙個串內的情況 於是在分別對這兩個串建 sa 減掉這兩次算出來的答案 現在的問題轉化為求出 height 陣列所有子區間...