題解 NOIP 2015 子串

2022-09-13 04:09:12 字數 1746 閱讀 7502

淦!這題我做了三個月啊

有兩個僅包含小寫英文本母的字串 \(a\) 和 \(b\)。

現在要從字串 \(a\) 中取出 \(k\) 個互不重疊的非空子串,然後把這 \(k\) 個子串按照其在字串 \(a\) **現的順序依次連線起來得到乙個新的字串。請問有多少種方案可以使得這個新串與字串 \(b\) 相等?

注意:子串取出的位置不同也認為是不同的方案。

第一行是三個正整數 \(n,m,k\),分別表示字串 \(a\) 的長度,字串 \(b\) 的長度,以及問題描述中所提到的 \(k\),每兩個整數之間用乙個空格隔開。

第二行包含乙個長度為 \(n\) 的字串,表示字串 \(a\)。

第三行包含乙個長度為 \(m\) 的字串,表示字串 \(b\)。

乙個整數,表示所求方案數。

由於答案可能很大,所以這裡要求輸出答案對 \(1000000007\) 取模的結果。

首先有這些變數名:

\(dp[i][j][k]\) : 表示拿\(a[i]\)與\(b[j]\)配對,配成\(k\)段的方案數,假如\(a[i]\)和\(b[j]\)配不上的話就等於\(0\)。

\(sum[i][j][k]\) : 表示\(a\)從\(1\)到\(i\),能和\(b[j]\)配成\(k\)段的方案總數(\(dp\)陣列的字首和陣列),意思就是\(sum[i][j][k] = dp[1][j][k] + dp[2][j][k]...+dp[i][j][k]\)。

那麼考慮單獨的\(a[i]\)和\(b[j]\),存在兩種情況:

第一種是\(a[i - 1]\)和\(b[j - 1]\)也配上了,那麼可以直接接在它們後面,也可以另起爐灶(為什麼不用考慮\(a[i - 1]\)和\(b[j - 1]\)沒接上的情況?因為沒接上的話\(dp[i - 1][j - 1] = 0\),無需考慮);

第二種是\(a[i - 1]\)和\(b[j - 1]\)沒配上,那我們就必須找到某個\(a[i']\)和\(b[j - 1]\)配上了,而且配成了\(k - 1\)段的地方,讓\(a[i]\)與\(b[j]\)接在後面配成第\(k\)段

然後我們發現,要找到\(a[i']\)和\(b[j']\)的位置是要\(o(n)\)處理的,時間複雜度承受不住,所以我們就要用到\(sum\)陣列,不用找,直接累加起前乙個匹配位置\(a[i']\)的方案數就可以

注意:我們的\(dp\)轉移方式是用\(a\)陣列的每一位去嘗試匹配\(b\)的某一位,只有\(b\)的上一位已經匹配過了,這一位才能繼續匹配

給大佬恰**:

#includeusing namespace std;

#define rint register int

int n, m, k;

int dp[2][210][210], sum[2][210][210];

char a[1010], b[250];

inline int read( void )

while( ch >= '0' && ch <= '9' )

return re * f;

}int main( void )

else dp[now][j][kk] = 0;

sum[now][j][kk] = ( sum[pre][j][kk] + dp[now][j][kk] ) % 1000000007; //處理字首和} }

swap( now, pre );

}cout << sum[pre][m][k];

return 0;

}

NOIP2015子串題解

題目描述 有兩個僅包含小寫英文本母的字串a和b。現在要從字串a中取出k個 互不重疊 的非空子串,然後把這k個子串按照其在字串a中出現的順序 依次連線 起來得到乙個新的字串,請問有多少種方案可以使得這個新串與字串b相等?注意 子串取出的位置不同也認為是不同的方案。輸入第一行是三個正整數n,m,k,分別...

解題報告 NOIP2015 子串

這是一道dp題,然後來想想怎麼表示狀態,對答案有影響的就是a串的第i個字元,b串的第j個字元,和k個子串,簡單來說就是和選取的字元和子串的數量有關.那麼設 f i j kk 表示在a串的前i個字元中選kk個子串匹配b串的前j個字元的方案數.求方案數可以採用加法原理,考慮a串的第i個字元,那麼這個字元...

NOIP2015提高組 子串

noip2015 提高組 day2 t2 有兩個僅包含小寫英文本母的字串 a 和 b 現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到乙個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出的位置不同也認為是...