【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多,然后改 ...
随机推荐
- mysql 查询表 的所有字段名称
select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name' and table_sc ...
- MATLAB常用函数
Matlab的内部常数 pi 圆周率 exp(1) 自然对数的底数e i 或j 虚数单位 Inf或 inf ...
- 批量远程执行shell命令工具
使用示例(使用了默认用户root,和默认端口号22): ./mooon_ssh --h=192.168.4.1,192.168.4.2 -P=password -c='cat /etc/hosts' ...
- struts2从浅至深(六)总结
在我认为strust2的作用就是 1.主要跟前端交互的框架数据提交先经过struts 2.起到对数据的过滤,接受数据 3.把数据显示到前段,具有很成熟的ognl技术,用起来特别方便 4.还提供了跟前段 ...
- (最短路 dijkstra)昂贵的聘礼 -- poj -- 1062
链接: http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- hdu 4983 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=4983 求有多少对元组满足题目中的公式. 对于K=1的情况,等价于gcd(A, N) * gcd(B, N) = ...
- 四则运算 Java 实现 刘丰璨,王翠鸾
四则运算 GitHub仓库 功能实现 [x] 使用 -n 参数控制生成题目的个数,并且根据解空间限制用户设定的范围(如 range == 2 时,用户却要求生成 10000 道题目,这明显不合理) [ ...
- cxgrid动态显示行号
uses cxLookAndFeelPainters; type TMyCxGrid = class(TObject) class procedure DrawIndicatorCell( ...
- Android-fragment的替换-V4支持包
昨天写的这几篇博客,Android-fragment简介-fragment的简单使用,Activity-fragment-ListView展示,Android-fragment生命周期,Android ...
- Java程序性能定位工具-火焰图
Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...