[COCI2020-2021#6] Anagramistica
[COCI2020-2021#6] Anagramistica
题意
给定
定义两个字符串相似当且仅当两个字符串排序后相等。
可以从中选出一些字符串,求有多少种方案,使得其中恰好有
思路
先将所有字符串排序,相同的归为一类,求出
定义
转移方程:
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e3 + 5;
const int mod = 1e9 + 7;
int n, k, dp[N][N], fac[N], facinv[N];
map <string, int> M;
int qpow(int a, int b) {
int res = 1;
for (; b; b >>= 1, a = a * a % mod)
if (b & 1) res = res * a % mod;
return res;
}
int C(int x, int y) {
return fac[x] * facinv[y] % mod * facinv[x - y] % mod;
}
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; i ++) {
string s; cin >> s;
sort(s.begin(), s.end());
M[s] ++;
}
fac[0] = facinv[0] = 1;
for (int i = 1; i <= 2000; i ++) {
fac[i] = fac[i - 1] * i % mod;
facinv[i] = qpow(fac[i], mod - 2);
}
dp[0][0] = 1; int l = 0;
for (auto p : M) {
l ++;
for (int i = 0; i <= k; i ++)
for (int j = 0; j <= p.second; j ++) {
if (i < j * (j - 1) / 2) continue;
dp[l][i] += dp[l - 1][i - j * (j - 1) / 2] * C(p.second, j);
dp[l][i] %= mod;
}
}
cout << dp[l][k] << "\n";
}
signed main() {
int Case = 1;
// cin >> Case;
while (Case --)
solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18409062,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】