タイトル説明
たった2つの文字列の小文字AとBが含まれています
文字列が今k番目の非重複空でない文字列から削除され、その後、k次のようにこの文字列は、彼らが新しい文字列を順次接続得られた文字列で表示され、することができますどのように多くのプログラム尋ねますこれは新しい文字列と文字列がBに等しいのですか?
注:異なるスキームは異なるサブ退避位置も考慮されています。
入力形式
最初の3行は、N、M、K、kはそれぞれ長さを表す正の整数であり、B列の長さ、およびスペースで区切られた各二つの整数の間のAに記載された問題の文字列説明。
二行目は、長さnの文字列を含む文字列を表すA.
第三のラインは、長さmの列にB.を表す文字列が含まれています
出力フォーマット
出力コモンラインは、必要なプログラムの数を表す整数を含んでいます。
答えは大きいかもしれないので、ので、ここで必要な結果出力への答えは十億七を法。
データ範囲
$ 1 \ n \ 200 \\\\ 1 \ K \ M $ \\\\ \ 1000年\\\\ 1 \ M
$ソリューション:$
限り、あなたは見るように、それはよくやったDPです。
提供$のDP I、Bのjビットをkと一致するサブストリングの前に完了した[I] [J] [k]が、[0/1] $ビットに一致を示し、選挙の現在位置が選択されていませんプログラムの数。
J [[I-1] DP [0] + [I-1]〜[J] [K] [0] = DP [I] [J] [k]が明らかにDPを$、最初に選択されない場合を考えます] [K] [1] $。選択されていない最後のオプションをすることができます。
あなたはこの1つを選択した場合、我々は$ a_iを= b_j $、そしてあなたのいずれかの選挙の前に1の場合はその文字列にも従って、だけでなく、新しい文字列を開き、新しい文字列を開き、上のことを確認する必要がありますビット何のために投票しない選択したので、3が追加されました。
スクロール配列。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 名前空間stdを使用。 typedefの長い長いLL。 CONST LL MOD = 1E9 + 7。 const int型N = 1005; N INT、M、K。 [N]、B [n]をchar型。 LL DP [2] [202] [202] [2]。 INTメイン() { scanf関数( "%D%D%D"、&N、&M、&K)。 scanf関数( "%sの"、A + 1); scanf関数( "%sの"、B + 1)。 DP [0] [0] [0] [0] = DP [1] [0] [0] [0] = 1。 今int型= 0、事前= 1; 以下のために(INT i = 1; iが<= N; iは++) { 今^ = 1、事前^ = 1; //のmemset(DP [今]、0、はsizeof(DP [今]))。 用(INTのJ = 1; J <= Mであり、j ++) { ための(int型K = 1; K <= K。 { DP [今] [J] [K] [1] =(DP [事前] [J-1] [K-1] [0] + DP [事前] [J-1] [K] [1] + DP [事前] [J-1] [K-1] [1])%MOD。 他DP [今] [J] [K] [1] = 0; DP [今] [j] [k]が[0] =(DP [事前] [j] [k]が[0] + DP [事前] [j] [k]を[1])%MOD。 } } } LL ANS =(DP [今] [M] [K] [0] + [今] DP [M] [K] [1])%MOD。 coutの<< ANS <<てendl; 0を返します。 }