NOI模擬 字元矩陣

2021-09-27 13:51:15 字數 1682 閱讀 4522

原題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 這裡...