相同字串問題 題解

2022-03-24 16:23:47 字數 1589 閱讀 8852

n張寫有字串的卡片,已知第i張卡片上的字串長度為ai。某人兩次從n張卡片中隨機抽取k1,k2張卡片,方法如下:其隨意抽出一張卡片,並記下卡上的字串,再將卡放回原處,這樣抽出ki張卡後,將每次抽出的字串順序排列起來,就得到乙個長度為ki次抽取的字串總長的新字串。

如果我們把每張卡片上的字串都用規定長度的小寫英文本串來表示,該人兩次抽取得到的新字串相等,那麼我們就稱這些小寫英文本串為方程的乙個解。

程式設計任務:給定n張卡片、各卡上的字串長,及該人兩次抽出的卡片編號,求使兩次抽取所得字串相等的方案數。

輸入格式

第一行有三個整數n,k1,k2,0<n<=50。接下來的一行有n個整數ai。第三行有k1個整數,為第一次抽取的卡片編號。第四行k2個整數,為第二次抽取的卡片編號。

輸出格式

輸出滿足條件的方案數。

樣例輸入1

3  2  2

1 1 1

1 2

1 3

樣例輸出1

676
這個題目描述非常難看懂……

我用下面這個資料解釋一下吧。

3 2 2

1 2 1

1 3 1 3

2 2

\(3\)張卡片,\(a_1=1,a_2=2,a_3=1\),一共\(4\)個字母。給每個單個的字母編號,用\(g[i]\)存第\(i\)張卡片的字元(動態陣列vector):

\[g[1]=\,g[2]=\,g[3]=\

\]那麼\(k_1\)就是\(1,4,1,4\)字母序列,\(k_2\)是\(2,3,2,3\)序列。

這兩個序列要對應相等,也就是序號為\(1\)的字母要等於序號為\(2\)的字母,相同的,\(字母4=字母3\)。

這樣可以得到一些相等的字母。把一堆相等的字母放到乙個集合中,一共有\(root\)個彼此分離的集合,那麼方案數就是\(26^\)。

於是可以用並查集做,注意資料範圍(題目好像沒說清楚,但反正很大,都26的乘方了),要高精度。

#include#include#includeusing namespace std;

int n,k1,k2,na=0,nb=0;

vectorg[51];

int a[10000],b[10000],par[10000],root;

struct hp;

void init()

n=k; root=n;

for(int i=1;i<=k1;i++)

len++;

while(len>1&&c.s[len-1]==0) len--;

c.len=len;

}int main()

ans.len=1; ans.s[0]=1;

for(int i=1;i<=n;i++) unite(a[i],b[i]);

for(int i=1;i<=root;i++) mult(ans,26,ans);

for(int i=ans.len-1;i>=0;i--) printf("%d",ans.s[i]);

return 0;

}

字串 題解

字串 小熊有乙個由小寫英文本母組成的字串s s ss 1 s ss 2 snsn sn。小熊想要計算s ss中有多少子串包含字串 bea rbear bear 也就是找出滿足字串x i,j sisi sis isi si 1 sjsj sj包含至少乙個字串 bea rbear bear 的 i ii...

字串題解

求有多少個長度為 n 僅包含前 k 個小寫字母且包含至少乙個長度不少於 2 的回文串的字串作為子串。對於 k 26 的情況,你只需要把每個字母當成乙個與其他字母均不同的字母,而無需關注它具體是什麼符號。答案需要對 998244353 乙個質數 取模。1 le n,k le 10 9 example ...

交換字元使得字串相同

有兩個長度相同的字串s1 和s2,且它們其中只含有字元 x 和 y 你需要通過 交換字元 的方式使這兩個字串相同。每次 交換字元 的時候,你都可以在兩個字串中各選乙個字元進行交換。交換只能發生在兩個不同的字串之間,絕對不能發生在同乙個字串內部。也就是說,我們可以交換s1 i 和s2 j 但不能交換s...