NOIP2015提高組T2 子串

2021-08-07 19:31:03 字數 1535 閱讀 3842

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

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

輸出共一行,包含乙個整數,表示所求方案數。由於答案可能很大,所以這裡要求輸出答案對 1,000,000,007 取模的結果。

6 3 1

aabaabaab

6 3 2

aabaabaab2

7這題在推出狀態後轉移時竟然改變了狀態的意義,**地打了1個小時。

下面要鄭重地寫一下狀態。

f[i][j][k]表示b串的1~i已被a串的1~j匹配完,此時匹配了k個子串,且a串的第j位匹配b串的第i位,此時的方案數。

則f[i][j][k]

=f[i-1][1~j-1]

[k-1

]+f[

i-1][

j-1][k

];前提是a[j]=b[i].

但這樣的轉移是o(nm^2k)的,還是會超時

所以我們可以記下來f[i-1][1~j-1][k-1] 的和啊。

這樣轉移就是o(1)的了,再開一維滾動防止爆記憶體。時間複雜度o(nmk).

這才將這題解決,可是考試時在這題上花了太多時間qwq,記住吧。

var mo,n,m,k,i,j,p,now,pre,s:longint;ans:int64;a,b:ansistring;

f:array[0..1,0..1000,0..1000]of longint;

begin

mo:=1000000007;

readln(n,m,k);

readln(a);

readln(b);

for i:=1 to n do if a[i]=b[1] then f[0][i][1]:=1;

for p:=2 to m do

begin

pre:=1-now;

for j:=1 to k do

begin

s:=0;

for i:=1 to n do

begin

s:=(s+f[now,i-1,j-1])mod mo;

if a[i]=b[p] then f[pre][i][j]:=(f[now][i-1][j]+s)mod mo

else f[pre][i][j]:=0;

end;

end;

now:=pre;

end;

for i:=1 to n do ans:=(ans+f[now][i][k])mod mo;

writeln(ans);

end.

NOIP2015提高組 子串

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

NOIP2015提高組 子串

看到方案數問題直覺就能想到dp,考慮用f i,j,k 表示a 1.i 取k個子串組成b 1.j 的方案數,發現很難轉移,因為不知道之前的方案哪些是還能拼接到結尾的,產生了前效性。考慮加一維,即 a 1.i 取k個子串組成b 1.j 且末尾子串還可以繼續拼接的方案數為 f i,j,k,0 a 1.i ...

NOIP2015提高組 子串 DP

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