牛客多校第5場 G題 subsequence1

2021-09-25 19:27:20 字數 1344 閱讀 5310

題意:乙個s的串中有多少個比t大的子串行(不連續的),要取模。

題解:純dp的題目。建立乙個三維dp[i][j][3],i,j代表了s的前i項有多少種子序列能匹配t的前j個數字。最後乙個維度3,代表有三個矩陣,乙個是s的前i項有多少種子序列能大於t的前j個數字(2),乙個是s的前i項有多少種子序列能等於t的前j個數字(1),乙個是s的前i項有多少種子序列能小於t的前j個數字(0)。

dp過程:

a:當s[i]>s[j]時候,dp[i][j][2] = dp[i-1][j-1][2] +dp[i-1][j-1][1] 。即:當當前s[i]比t[i]大的時候,大於的矩陣加上上乙個已經大於的子串行的個數(存在dp[i-1][j-1][2]中),加上上乙個已經等於的子串行的個數(存在dp[i-1][j-1][1]中),上一位如果是小於的話,那麼不用加,因為加上了還是小於。

b:剩下的2種以此類推。

c:特判0的位置,如果當前為0,且j從第一位開始比較,則是不行的,應為不能前導0。即,子串t[1]!=『0』;

d:注意dp的起點。

**:

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const ll mo =

998244353

;const

int ma =

3e3+7;

long

long dp[ma]

[ma][3

];char s[ma]

, t[ma]

;int case, n, m;

intmain()

if(s[i]

> t[j])if

(s[i]

== t[j])if

(s[i]

< t[j]

) dp[i]

[j][0]

%= mo;

dp[i]

[j][1]

%= mo;

dp[i]

[j][2]

%= mo;}}

ll ans =0;

for(

int i = m; i <= n; i++

) ans =

(ans+dp[n]

[i][2]

)%mo;

cout << ans << endl;

}return0;

}

牛客多校第5場D Drop Voicing

有乙個1 n的排列,有以下兩種操作 drop 2 將倒數第二個數放到開頭,前面的數向後平移 invert 將倒數第二個數放到開頭,前面的數向後平移 若干連續的drop 2稱為multi drop。計算要使該排列排成1 n所需的最少的multi drop的數量。首先invert可以無條件使用,那麼就可...

牛客多校第3場 C Shuffle Cards

之所以補這題,是因為第一次使用rope,這是乙個可持久化平衡樹。不過本題沒有用到可持久化就是了,平衡樹的split和merge。include using namespace gnu cxx 下標從0開始,不可以cin,可以cout 由於rope的底層實現,insert,erase,get都是log...

2020牛客多校第二場G

題意 給你兩個序列,問你從第乙個序列中有多少個與第二個序列長度相同的並且對應位置都是大於等於第二個序列的子串。題解 神仙bitset題,維護第二個序列的bitset,例如樣例中的 2 3 3,按照大小排序後維護的m個bitset為 0100,0110,0111,樣例中的資料維護的bitset不是很好...