【xsy1058】 单词 乱搞
题目大意:给你$n$个长度为$m$的字符串,字符集仅为{x,y,z}三个字符,定义两个字符串$(s_i,s_j)$的相似度为$\sum_{k=1}^{m} [s_i[k]==s_j[k]]$。
从$0$到$m$询问你相似度为i的字符串的对数。
数据范围:$n\times m≤100000$(没错是乘号)
此题的题解做法貌似是:分$m≤12$和$m>12$来做。
先考虑$m≥12$的,考虑直接暴力判断,复杂度就是$O(mn^2)$的,显然是可以过的
当$m≤12$时,我们做一个$dp$,令$f[i][j]$表示前$i$个字符串中,字符串为$j$的个数。
考虑到字符集的大小,字符串的数量显然是$3^m$的
时间复杂度:$O(n\times 3^{m})$。
然而,这题的时限是3s,经过测试,我们发现当$m>2$时,都可以在$3s$内跑完。
所以我们只需要特殊处理下$m=1$和$m=2$的情况就可以了。
代码短了很多qwq
(所以字符集是不是可以出大一些了呢)
#include<bits/stdc++.h>
#define M 100005
#define L long long
#define S(x) x*(x-1)/2
using namespace std;
char *c[M]={};
int n,m; L ans[M]={}; void solve1(){
L cnt1=,cnt2=,cnt3=;
for(int i=;i<=n;i++){
if(c[i][]=='x') cnt1++;
if(c[i][]=='y') cnt2++;
if(c[i][]=='z') cnt3++;
}
ans[]=S(cnt1)+S(cnt2)+S(cnt3);
ans[]=cnt1*cnt2+cnt1*cnt3+cnt2*cnt3;
}
void solve2(){
L cnt[][]={};
for(int i=;i<=n;i++){
int l,r;
if(c[i][]=='x') l=;
if(c[i][]=='y') l=;
if(c[i][]=='z') l=;
if(c[i][]=='x') r=;
if(c[i][]=='y') r=;
if(c[i][]=='z') r=;
cnt[l][r]++;
}
for(int i=;i<;i++) for(int j=;j<;j++){
ans[]+=S(cnt[i][j]);
for(int ii=;ii<;ii++) for(int jj=;jj<;jj++){
int hh=(i==ii)+(j==jj); if(hh==) continue;
ans[hh]+=cnt[i][j]*cnt[ii][jj];
}
}
ans[]/=; ans[]/=;
}
void solve3(){
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
int cnt=;
for(int k=;k<m;k++) cnt+=(c[i][k]==c[j][k]);
ans[cnt]++;
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
c[i]=new char[m];
scanf("%s",c[i]);
}
if(m==) solve1();
if(m==) solve2();
if(m>=) solve3();
for(int i=;i<=m;i++) printf("%lld\n",ans[i]);
}
【xsy1058】 单词 乱搞的更多相关文章
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][D ...
- SCOI 2013 密码 & 乱搞
题意: Fish 是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息:1. 该密 ...
- 种树 & 乱搞
题意: 在一个(n+1)*(m+1)的网格点上种k棵树,树必须成一条直线,相邻两棵树距离不少于D,求方案数. SOL: 这题吧...巨坑无比,本来我的思路是枚举每一个从(0,0)到(i,j)的矩形,然 ...
- URAL - 1920 Titan Ruins: the Infinite Power of Magic(乱搞)
搞死人的题目,,, 就是在n*n的方格中找路径长度为L的回路. 开始的思路值适合n为偶数的情况,而忽视了奇数的case,所以wa了一次. 然后找奇数case的策略,代码从70多行变成了100多,然后改 ...
随机推荐
- yii2学习网站
1.http://tech.anruence.com/ 2.http://www.yiichina.com/doc/guide/2.0/input-multiple-models
- MVC各层应该要实现的代码
1.C 在设计良好的应用中,控制器很精练,包含的操作代码简短: 如果你的控制器很复杂,通常意味着需要重构,转移一些代码到其他类中. 归纳起来,控制器 可访问 请求 数据; 可根据请求数据调用 模型 的 ...
- CentOS7中实用的命令总结
一:软件安装配置方面 这里总结一下对个人很实用的功能 1.查询rpm包的依赖哪些文件:rpm -qpR xx.rpm,然后rpm会分析此包的文件依赖性 2.查询系统中安装了哪些rpm包:rpm -qa ...
- Freetype字体引擎分析与指南
Freetype字体引擎分析与指南,很不错的一篇教程,推荐!!
- 伪共享(False Sharing)
原文地址:http://ifeve.com/false-sharing/ 作者:Martin Thompson 译者:丁一 缓存系统中是以缓存行(cache line)为单位存储的.缓存行是2的整数 ...
- Spark应用程序的运行架构几种说
(1)简单的说: 由driver向集群申请资源,集群分配资源,启动executor.driver将spark应用程序的代码和文件传送给executor.executor上运行task,运行完之后将结果 ...
- REST格式
首先要明确一点:REST 实际上只是一种设计风格,它并不是标准.(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准).aisuhua/restful-api-design-ref ...
- Android-Java-IO流概述
IO:I:Input输入 O:Output输出 IO流: IO:用于处理设备上数据的一种技术,处理设备上数据包括(Input / Output) ,设备指的是:内存,硬盘,U盘,打印机,等等..... ...
- AndroidPn消息推送
接着前面的工作,消息接收之后,要推送给不同的客户端.关于消息推送,网上有很多方式,http长连接,xmpp协议,还有一个谷歌的貌似叫C2DM的东西. 在此之前,用openfire做了一个小demo,例 ...
- PYQT5实现文件目录浏览
def setBrowerPath(self): download_path = QtWidgets.QFileDialog.getExistingDirectory(self, "浏览&q ...