給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩個子串中有乙個位置不同。
題中所求即為a串與b串任意一組height之和,所以暴力可以做到$o(n^2)$
考慮將答案掛在這兩組字尾中sa值較大的那個上,即每個字尾只考慮出現在它前的所有字尾貢獻的答案
由於lcp長度為在這兩排名間height的最小值,可以按排名列舉字尾,單調棧維護答案
可以做到$o(n \log n)$或$o(n)$
#include#include[haoi2016]找相同字元#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;
}
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 陣列所有子區間...