【题解】P7552 [COCI2020-2021#6] Anagramistica

news/2024/12/5 11:57:09/

题目传送门.

分析

这道题有个比较明显的思路就是把所有相似的字符串分为一组,然后对每一组进行 dp ,设 f i , j f_{i,j} fi,j 表示当前到了第 i i i 组,已经凑出了 j j j 对相似的串的方案数.

考虑如何计算贡献,假设现在已经到了第 i i i 组,第 i i i 组一共有 n u m i num_i numi 个字符串,准备选 x x x 个字符串,那么这一组对总相似对数的贡献就是 x ∗ ( x − 1 ) / 2 x*(x-1)/2 x(x1)/2 ,对方案数的贡献就是 C n u m i x C_{num_i}^x Cnumix.

所以状态转移方程就出来了:
f i , j = f i , j + f i − 1 , j − x ∗ ( x − 1 ) / 2 × C n u m i x f_{i,j} = f_{i,j}+f_{i-1,j-x*(x-1)/2}\times C_{num_i}^x fi,j=fi,j+fi1,jx(x1)/2×Cnumix

还有个显然的点就是对于每一组只需要记录这一组一共有几个字符串就可以了 这个应该都知道罢.

预处理

组合数 C C C

因为要用到组合数 C C C 所以对 C C C 进行预处理.

当然也有预处理阶乘和逆元的做法,因为我太菜了所以只给出 n 2 n^2 n2 的预处理版本.

void init(){C[0][0] = 1;for(int i = 1; i <= 2000; i++){C[i][0] = C[i][i] = 1;for(int j = 1; j < i; j++){C[i][j] = (C[i-1][j] + C[i-1][j-1]) % mod;}}
}

对于组合数学不了解的可以去看我这篇博客 【学习笔记】组合计数.

相似串的统计

不知道冷不冷的知识:字符串也是可以进行排序的.

	for(int i = 1 ;i <= n; i++){string s;cin >> s;sort(s.begin(),s.end());if(!m.count(s)){m[s] = ++cnt;}int id = m[s];num[id]++;}

Code

#include <bits/stdc++.h>
const int mod = 1e9+7;
const int N = 2e3+10;
#define int long long
using namespace std;
map<string,int> m;
int num[N],cnt = 0;
int n;
int f[N][N];
int k;
int C[N][N];
void init(){C[0][0] = 1;for(int i = 1; i <= 2000; i++){C[i][0] = C[i][i] = 1;for(int j = 1; j < i; j++){C[i][j] = (C[i-1][j] + C[i-1][j-1]) % mod;}}
}
signed main(){init();cin >> n >> k;for(int i = 1 ;i <= n; i++){string s;cin >> s;sort(s.begin(),s.end());if(!m.count(s)){m[s] = ++cnt;}int id = m[s];num[id]++;}	f[0][0] = 1;for(int i = 1; i <= cnt; i++){for(int j = 0; j <= k; j++){for(int x = 0; x <= num[i]&&x*(x-1)/2<=j; x++){f[i][j] = (f[i][j] + (f[i-1][j-x*(x-1)/2]*C[num[i]][x])%mod)%mod;}}}cout << f[cnt][k];return 0;
}

坑点

记得取模和开 long long !!!


http://www.ppmy.cn/news/1192904.html

相关文章

数据分析过程中,发现数值缺失,怎么办?

按照数据缺失机制&#xff0c;数据分析过程中&#xff0c;我们可以将其分为以下几类&#xff1a; &#xff08;1&#xff09;完全随机缺失&#xff08;MCAR&#xff09;&#xff1a;所缺失的数据发生的概率既与已观察到的数据无关&#xff0c;也与未观察到的数据无关。 &#x…

0基础学习PyFlink——事件时间和运行时间的窗口

大纲 定制策略运行策略Reduce完整代码滑动窗口案例参考资料 在 《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》一文中&#xff0c;我们使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间&#xff1a; reducedkeyed.window(TumblingProcess…

提示3D标题编辑器仍在运行如何解决 3D标题编辑器怎么使用

品牌型号&#xff1a;联想GeekPro 2020 系统&#xff1a;Windows 10 64位专业版 软件版本&#xff1a;会声会影2023旗舰版 3D标题因其独特的表现形式和多变的画面效果&#xff0c;被广泛应用于节目片头、宣传片、开幕式等诸多场景之中。掌握3D标题的使用技巧&#xff0c;能够…

PP系统是什么

PP系统通常指的是“人力资源管理系统”&#xff08;HRM系统&#xff09;&#xff0c;它是一种用于管理组织内人力资源的软件系统。PP系统的功能通常包括以下内容&#xff1a; 员工信息管理&#xff1a;记录和维护员工的个人信息、联系信息、工作经历等。 薪酬管理&#xff1a;…

闹了个乌龙,Lattice文档写反了(FTUSB-0)

日常唠嗑 好久没唠嗑了&#xff0c;进入正文前&#xff0c;讲点打工心得。 打工是真的会磨人心志&#xff0c;也不是上班说有多累&#xff0c;主要是深圳通勤一般比较长&#xff0c;我在南山上班&#xff0c;住宝安&#xff0c;早上地铁加步行一般一小时。最近晚上经常睡…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

shell script 案例二

需求&#xff0c;运行程序&#xff0c;用户输入firstname&#xff0c;回车&#xff0c;再次提示输入lastname&#xff0c;然后回车&#xff0c;屏幕打印fullname信息 注意&#xff1a;前期写程序要注意规范&#xff0c;方便以后自己写多了回头看可以看的懂&#xff0c;程序代码…

伊朗网络间谍组织针对中东金融和政府部门

导语 近日&#xff0c;以色列网络安全公司Check Point与Sygnia发现了一起针对中东金融、政府、军事和电信部门的网络间谍活动。这一活动由伊朗国家情报和安全部门&#xff08;MOIS&#xff09;支持的威胁行为者发起&#xff0c;被称为"Scarred Manticore"。该组织被认…