[CEOI2019]Cubeword(暴力)
没错,标签就是暴力。
首先发现棱上的所有词长度都相等,枚举长度 \(len\)。
然后发现这些词中只有第一个字符和最后一个字符比较重要(只有这两个位置会与别的串衔接,中间的是啥无所谓)。
令 \(cnt_{i,j}\) 为第一个字符是 \(i\),最后一个字符是 \(j\) 的词的个数。注意的是一个串反过来也算一个合法的串(题意说了正反读都行),但是如果这个反串也在输入中被给出了那就不重复算了。
容易想到 \(O(|\Sigma|^8len)\) 的最暴力做法:枚举八个顶点。
下面还有六次方五次方的部分分,略过。直接讲 \(O(|\Sigma|^4len)\) 的正解。
假如这个立方体是 \(ABCD-A'B'C'D'\),枚举 \(A,C,B',D'\) 上的字符。对于每个剩下的顶点,与它相邻的三个顶点已经被枚举到了。
问题就是快速求每个剩下的顶点的方案数。
再计算 \(tot_{i,j,k}\) 为相邻三个字符是 \(i,j,k\) 的方案数。也可以四次方解决。
这样常数不够优秀,注意到预处理时 \(i,j,k\) 时顺序没啥大关系,计算时 \(A,C,B',D'\) 的顺序也没啥大关系(乘个系数就好了),所以可以有个 \(\frac{1}{6}\) 的常数。
那就做完了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010,mod=998244353,val[2][2][2]={{{24,12},{12,4}},{{12,6},{4,1}}};
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,cnt[62][62],tot[62][62][62],l[maxn],ans;
char s[maxn][13];
bool pali[maxn];
map<string,bool> vis;
inline int id(char c){
if(c>='a' && c<='z') return c-'a';
if(c>='A' && c<='Z') return c-'A'+26;
if(c>='0' && c<='9') return c-'0'+52;
}
int main(){
n=read();
FOR(i,1,n){
scanf("%s",s[i]);
l[i]=strlen(s[i]);
pali[i]=true;
FOR(j,0,l[i]-1) if(s[i][j]!=s[i][l[i]-1-j]) pali[i]=false;
}
FOR(len,3,10){
MEM(cnt,0);MEM(tot,0);
vis.clear();
int upr=0;
FOR(i,1,n) if(l[i]==len){
if(vis[string(s[i])]) continue;
string tmp=string(s[i]);
reverse(tmp.begin(),tmp.end());
vis[tmp]=true;
cnt[id(s[i][0])][id(s[i][l[i]-1])]++;
if(!pali[i]) cnt[id(s[i][l[i]-1])][id(s[i][0])]++;
upr=max(upr,id(s[i][0]));
upr=max(upr,id(s[i][l[i]-1]));
}
FOR(i,0,upr) FOR(j,i,upr) FOR(k,j,upr) FOR(l,0,upr)
tot[i][j][k]=(tot[i][j][k]+1ll*cnt[i][l]*cnt[j][l]%mod*cnt[k][l])%mod;
FOR(i,0,upr) FOR(j,i,upr) FOR(k,j,upr) FOR(l,k,upr){
int s=1ll*tot[i][j][k]*tot[i][j][l]%mod*tot[i][k][l]%mod*tot[j][k][l]%mod,hhh=0;
ans=(ans+1ll*s*val[i==j][j==k][k==l])%mod;
}
}
printf("%d\n",ans);
}
[CEOI2019]Cubeword(暴力)的更多相关文章
- P6845 [CEOI2019] Dynamic Diameter
P6845 [CEOI2019] Dynamic Diameter 题意 一颗带权树,每次更改一条边的权,每次修改后求出最大直径.强制在线. 思路 \(O(n\log^2n)\) 的暴力做法. 根据经 ...
- zone.js - 暴力之美
在ng2的开发过程中,Angular团队为我们带来了一个新的库 – zone.js.zone.js的设计灵感来源于Dart语言,它描述JavaScript执行过程的上下文,可以在异步任务之间进行持久性 ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- HDU 5944 Fxx and string(暴力/枚举)
传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Othe ...
- 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)
湘潭邀请赛的一题,名字叫"超级FFT"最终暴力就行,还是思维不够灵活,要吸取教训. 由于每组数据总量只有1e5这个级别,和不超过1e6,故先预处理再暴力即可. #include&l ...
- fragment+viepager 的简单暴力的切换方式
这里是自定义了一个方法来获取viewpager private static ViewPager viewPager; public static ViewPager getMyViewPager() ...
- ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力
Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS Memory Limit:65536KB 64bit IO Fo ...
- uoj98未来程序改 纯暴力不要想了
暴力模拟A了,数据还是良(shui)心(shui)的 90分的地方卡了半天最后发现一个局部变量被我手抖写到全局去了,,, 心碎*∞ 没什么好解释的,其实只要写完表达式求值(带函数和变量的),然后处理一 ...
- 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...
随机推荐
- [译]ABP v1.0终于发布了!
ABP v1.0终于发布了! 今天是个大日子!经过约3年的不断开发,第一个稳定的ABP版本,1.0,已经发布了.感谢为该项目做出贡献或试用过的每个人. 立即开始使用新的ABP框架:abp.io/get ...
- 推荐书单(网课)-人生/编程/Python/机器学习-130本
目录 总计(130本) 一.在读 二.将读 三.已读 非专业书单(77本) 四.已读 专业书单(53本) 五.已看网课(8个) 六.在看网课 一个人如果抱着义务的意识去读书,便不了解读书的艺术.--林 ...
- Sharding-JDBC:单库分表的实现
剧情回顾 前面,我们一共学习了读写分离,垂直拆分,垂直拆分+读写分离.对应的文章分别如下: Sharding-JDBC:查询量大如何优化? Sharding-JDBC:垂直拆分怎么做? 通过上面的优化 ...
- Python连载47-json文件、正则表达式初步
一.在线工具 1.https://www.sojson.com/ 2.http://www.w3cshool.com.cn/json/ 3.http://www.runoob.com/json/jso ...
- npm 被墙怎么办
npm install typescript --registry=http://registry.npm.taobao.org 使用下面的命令.
- tensorflow slim代码使用
此处纯粹作为个人学习使用,原文连接:https://www.jianshu.com/p/dc24e54aec81 这篇文章是借鉴很多博文的,作为一个关于slim库的总结 导入slim模块 import ...
- 【转】Oracle重置序列(不删除重建方式)
Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译.不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequen ...
- oracle查找某个字符在字符串中的个数的技巧
Oracle没有提供查找某个字符在字符串中出现次数的函数,当遇到这样的需求的时候,我们只能使用另外的方法去实现. 简单的思路就是,假设有个字符串str,然后里面有n个[a]字符,当把这n个[a]字符去 ...
- 数据库——SQL-SERVER练习(6) 数据库安全性
一.实验准备 (1)运行SQL-SERVER服务管理器, 启动服务(2)运行查询分析器, 以DBA身份登录数据库服务器: 用户名sa, 密码123456(3)打开CREATE-TABLE ...
- fastdfs详细安装教程
前言 最近开始搞的项目涉及到 fastdfs,工欲善其事,必先利其器,于是我自己搭了一台 fastdfs 服务器.坑已经帮大家都踩过了.按照该教程100%能安装成功. 前期准备 一个centos7 一 ...