第一行包含兩個整數n, m,分別表示上下兩個管道中球的數目。 第二行為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中a表示淺色球,b表示深色球。 第三行為乙個ab字串,長度為m,表示下管道中的情形。
僅包含一行,即為 sigma(ai^2) i從1到k 除以1024523的餘數。
2 1abb5
樣例即為文中(圖3)。共有兩種不同的輸出序列形式,序列bab有1種產生方式,而序列bba有2種產生方式,因此答案為5。
【大致資料規模】
約30%的資料滿足 n, m ≤ 12;
約100%的資料滿足n, m ≤ 500。
正解:$dp$。
思路比較巧妙。注意到$a_$平方以後不好處理,那麼我們可以下意識地想到,其實這就是$4$個管道輸出序列相同的一種情況。兩個管道相同的有$a_$種方案,那麼$4$個管道方案組合,自然也就有$a_^$種方案了。
接下來的事就很簡單了,設$f[i][j][k][l]$表示$4$個管道分別丟了第$i$個,第$j$個,第$k$個,第$l$個珠子的相同序列方案數。因為我們要求兩個序列要相同,所以很顯然,$i+j=k+l$,於是我們可以去掉$l$這一維狀態。然後我們判斷$4$個珠子兩兩相等的情況轉移就行了。
1//it is made by wfj_2048~
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
13#define rhl (1024523)
14#define il inline
15#define rg register
16#define ll long long
17#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
1819
using
namespace
std;
2021
int f[510][510][510
],n,m;
22char a[510],b[510
];23
24 il int
gi()
3132 il void
work()
42if (a[i]==b[i+j-k] &&i)
46if (b[j]==a[k] && j &&k)
50if (b[j]==b[i+j-k] &&j)54}
55 printf("
%d\n
",f[n][m][n]); return;56
}5758int
main()
bzoj1566 NOI2009 管道取珠
第一行包含兩個整數n,m,分別表示上下兩個管道中球的數目。第二行為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中a表示淺色球,b表示深色球。第三行為乙個ab字串,長度為m,表示下管道中的情形。output 僅包含一行,即為 sigma ai 2 i從1到k 除以1024523的餘數。sa...
bzoj1566 NOI2009 管道取珠
題目大意 兩個輸入管道裡面分別有n m個有著兩種顏色的珠子。只從右端取。依次於輸出管道中形成。設對於一種的輸出方式有ai 種產生方法有k種不同的輸出方式,求 k i 1a 2i。題解 智商dp 看到a 2i想到什麼呢?ai ai 嗯.a i 是相同方式的產生方法的個數,那麼ai ai 就可以看成兩個...
bzoj1566 Noi2009 管道取珠
題意 兩個棧不斷pop,共c n m,n 種,ai表示每個相同序列的方案數,求 ai 2 sol 首先,將相同的序列看做兩個人選取後相同的方案數 考慮dp,dp i j k l 表示第乙個人從上面選i個,下面選j個,第二個人上k個下l個的答案 顯然第四維狀態可以由前三維決定 不過還是不太好轉移,將狀...