GDOI三校聯考 字串轉換

2021-08-21 07:15:46 字數 1464 閱讀 4894

給出兩個字串s和t,它們長度相等,都是由小寫字母『a』、『b』、『c』組成。每次操作,你可以對字串s進行如下操作之一:

1、 選擇s的乙個字元『a』,把該字元變成字元『b』,費用是cost[0]。

2、 選擇s的乙個字元『b』,把該字元變成字元『c』,費用是cost[1]。

3、 選擇s的乙個字元『c』,把該字元變成字元『a』,費用是cost[2]。

你的目標是把字串s變成t,但是總費用不能超過給定的maxcost,有多少種不同的操作方式?下面定義「不同的操作方式」:假設有兩種操作方式a和b,只要滿足如下兩種情況之一,就認為是「不同的操作方式」:

1、a和b的操作次數不同。

2、存在乙個整數k,在第k輪操作時,操作方式a是選擇第i個字元進行變化,而操作方式b是選擇第j個字元進行變化,且i不等於j。

woc真的是數論學傻了,連矩陣乘法裸題都不會了。

woc又發現連矩陣乘法的求和套路都忘了……

code:

#include

#include

#define ll long long

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define fd(i, x, y) for(int i = x; i >= y; i --)

using

namespace

std;

const

int mo = 1e9 + 7;

char s[20], t[20];

int n, a[20], c[3], mx;

int num[20][20], tn;

ll b[200][200], e[200][200], d[200][200];

int main()

int g = mx / (c[1] + c[2] + c[0]);

fo(i, 0, n) fo(j, 0, n - i) num[i][j] = ++ tn;

fo(i, 0, n) fo(j, 0, n - i)

g *= 3; fo(i, 1, n) g += a[i];

tn ++; b[num[0][0]][tn] = 1; b[tn][tn] = 1;

fo(i, 1, tn) d[i][i] = 1;

g ++;

while(g)

fo(i, 1, tn) fo(j, 1, tn) e[i][j] = b[i][j], b[i][j] = 0;

fo(k, 1, tn) fo(i, 1, tn) fo(j, 1, tn) b[i][j] = (b[i][j] + e[i][k] * e[k][j]) % mo;

g /= 2;

}int p1 = 0, p2 = 0;

fo(i, 1, n)

printf("%lld", d[num[p1][p2]][tn]);

}

jzoj3252 GDOI三校聯考 炸彈

在乙個n行m列的二維網格裡,有些格仔是空地 用字元 表示 有些格仔是障礙物 用字元 表示 每個空地格仔都有乙隻蟲子,蟲子不會移動。fj打算用最少的炸彈把所有的蟲子消滅。fj每次可以選擇在乙個空地格仔 不妨假設是格仔a 放置乙個炸彈,這個炸彈 後,格仔a的蟲子會被消滅,假設有另乙個空地格仔b,如果空地...

jzoj3252 GDOI三校聯考 炸彈

在乙個n行m列的二維網格裡,有些格仔是空地 用字元 表示 有些格仔是障礙物 用字元 表示 每個空地格仔都有乙隻蟲子,蟲子不會移動。fj打算用最少的炸彈把所有的蟲子消滅。fj每次可以選擇在乙個空地格仔 不妨假設是格仔a 放置乙個炸彈,這個炸彈 後,格仔a的蟲子會被消滅,假設有另乙個空地格仔b,如果空地...

十二省聯考 字串問題

傳送門 顯然是建圖跑最長路一類的問題,我們需要將 字尾樹上對於點 而構造目標串的過程是 先選擇乙個 那麼隨便怎麼建一下圖就可以了。至於構造的目標串能否無限長,只需要看建出的圖有沒有環即可。務必用拓撲排序實現。spfa只有暴力分 code by uselessname pragma g optimiz...