原題cf613e
官方題解
神級dp
dpdp
。把一條匹配路徑分為左中右三段,左邊和右邊都是往乙個方向走一段然後返回,而中間就是往乙個方向蛇皮走位。
於是串分兩個方向兩次dpdp
dp。注意dpdp
dp的細節判斷,以及雜湊區間的左右方向。對於m
mm較小的情況可以直接算。記得要雙雜湊,我太難了。
#include
using
namespace std;
#define puu pair
#define mp make_pair
const
int maxn=
2e3+
10,mod=
1e9+7;
const
int base1=
37,base2=
131;
inline
intadd
(int x,
int y)
inline
intdec
(int x,
int y)
inline
intmul
(int x,
int y)
inline
void
add(
int&x,
int y)
int p1[maxn]
,p2[maxn]
;int n,m,ans=
0,f[2]
[maxn]
[maxn]
;struct str
for(
int i=len;i>=1;
--i)
}inline puu hash
(int l,
int r)
}s1,s2,w;
inline
void
prework()
inline
void
solve
(int m,
int ret=0)
}if(m==2)
for(
int i=
1;i++i)
}printf
("%d\n"
,ret);}
inline
bool
operator==(
const puu &a,
const puu &b)
intmain()
}for
(int i=n;i>=1;
--i)
}for
(int i=
1;i<=n+1;
++i)
}memset
(f,0
,sizeof f)
,f[0
][n+1]
[0]=f[1]
[n+1][
0]=1
;for
(int i=n;i>=1;
--i)
}for
(int i=n;i>=1;
--i)
}for
(int i=
1;i<=n+1;
++i)
}printf
("%d\n"
,ans)
;}
Jzoj2921 NOI2012模擬題 字串識別
題意 給乙個字串,對於每個位置i,求出最短滿足的子串 l,r 使得i l,r 且這個子串只出現一次,輸出這個子串的長度 神 shui 題,ac後看了下別人的code發現全都是字尾陣列 難看 可能是因為我太弱了所以只想到sam的演算法 做法 建立sam,求出parent樹,預處理倍增,讓後就可以o l...
Jzoj2921 NOI2012模擬題 字串識別
題意 給乙個字串,對於每個位置i,求出最短滿足的子串 l,r 使得i l,r 且這個子串只出現一次,輸出這個子串的長度 神 shui 題,ac後看了下別人的code發現全都是字尾陣列 難看 可能是因為我太弱了所以只想到sam的演算法 做法 建立sam,求出parent樹,預處理倍增,讓後就可以o l...
NOI模擬 最短路
內網傳送門 由於求最短路,邊權為1 11,那麼考慮在bfs bfsbf s樹上dpdp dp,類似於模擬bfs bfsbf s樹的生成過程。用f i j f i j f i j 表示當前的bfs bfsbf s樹上一共有i ii個點,最後一層有j jj個點的狀態的概率 i ii中包含了j jj 這裡...