這題感覺有點坑啊。
題目還是不難想的,先對乙個字串建字尾自動機,然後拿另乙個字串在上面跑。
假設當前跑到了p點,匹配長度為len。
那麼當前會對答案產生貢獻的串是哪些呢?
顯然當前會對p及p到根的鏈產生貢獻。
這樣顯然可以用樹形dp優化。
同時需要差分(我也不知道這是否是必須的)。
下面有update。
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define mem1(i,j) memset(i,j,sizeof(i))
#define mem2(i,j) memcpy(i,j,sizeof(i))
#define ll long long
#define up(i,j,n) for(int i=(j);i<=(n);i++)
#define file "dealing"
#define poi vec
#define eps 1e-10
#define db double
const int maxn=401000,inf=1000000000,mod=1000000007;
int read()
while(ch<='9'&&ch>='0')
return f*x;
}bool cmax(int& a,int b)
struct sam
int extend(int x)
} }int getsort()
int walkprepare()
int walk(int x)
int build(char* s)
}a;char s[maxn];
ll ans[maxn],w[maxn],e[maxn];
int main()
for(int i=a.cnt;i>=1;i--)
ll sum=0;
for(int i=a.cnt;i>=1;i--)ans[i]+=ans[i+1],sum+=ans[i];
cout發現自己的做法麻煩了,我們又不用求長度為i的子串的方案,ans完全可以省略,直接預處理到這個節點的方案數,最後加上去即可。
code:修改版本
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define mem1(i,j) memset(i,j,sizeof(i))
#define mem2(i,j) memcpy(i,j,sizeof(i))
#define ll long long
#define up(i,j,n) for(int i=(j);i<=(n);i++)
#define file "find_2016"
#define poi vec
#define eps 1e-10
#define db double
const int maxn=401000,inf=1000000000,mod=1000000007;
int read()
while(ch<='9'&&ch>='0')
return f*x;
}bool cmax(int& a,int b)
struct sam
int extend(int x)
} }int getsort()
int walkprepare()
int walk(int x)
int build(char* s)
}a;char s[maxn];
ll ans=0;
int main()
cout
}
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 陣列所有子區間...
HAOI 2016 找相同字元
題目鏈結 演算法 首先 子串是字尾的字首 考慮拼接兩個字串 中間用不可見字元隔開 求出該字串的字尾陣列 那麼字首相同的字尾一定排名一定接近 而我們又知道lcp i j min 維護乙個單調遞增的字尾陣列即可 時間複雜度 o nlogn n a b includeusing namespace std...