没错,标签就是暴力。

首先发现棱上的所有词长度都相等,枚举长度 \(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}\) 的常数。

那就做完了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=100010,mod=998244353,val[2][2][2]={{{24,12},{12,4}},{{12,6},{4,1}}};
  4. #define lson o<<1,l,mid
  5. #define rson o<<1|1,mid+1,r
  6. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  7. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  8. #define MEM(x,v) memset(x,v,sizeof(x))
  9. inline int read(){
  10. int x=0,f=0;char ch=getchar();
  11. while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
  12. while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
  13. return f?-x:x;
  14. }
  15. int n,cnt[62][62],tot[62][62][62],l[maxn],ans;
  16. char s[maxn][13];
  17. bool pali[maxn];
  18. map<string,bool> vis;
  19. inline int id(char c){
  20. if(c>='a' && c<='z') return c-'a';
  21. if(c>='A' && c<='Z') return c-'A'+26;
  22. if(c>='0' && c<='9') return c-'0'+52;
  23. }
  24. int main(){
  25. n=read();
  26. FOR(i,1,n){
  27. scanf("%s",s[i]);
  28. l[i]=strlen(s[i]);
  29. pali[i]=true;
  30. FOR(j,0,l[i]-1) if(s[i][j]!=s[i][l[i]-1-j]) pali[i]=false;
  31. }
  32. FOR(len,3,10){
  33. MEM(cnt,0);MEM(tot,0);
  34. vis.clear();
  35. int upr=0;
  36. FOR(i,1,n) if(l[i]==len){
  37. if(vis[string(s[i])]) continue;
  38. string tmp=string(s[i]);
  39. reverse(tmp.begin(),tmp.end());
  40. vis[tmp]=true;
  41. cnt[id(s[i][0])][id(s[i][l[i]-1])]++;
  42. if(!pali[i]) cnt[id(s[i][l[i]-1])][id(s[i][0])]++;
  43. upr=max(upr,id(s[i][0]));
  44. upr=max(upr,id(s[i][l[i]-1]));
  45. }
  46. FOR(i,0,upr) FOR(j,i,upr) FOR(k,j,upr) FOR(l,0,upr)
  47. tot[i][j][k]=(tot[i][j][k]+1ll*cnt[i][l]*cnt[j][l]%mod*cnt[k][l])%mod;
  48. FOR(i,0,upr) FOR(j,i,upr) FOR(k,j,upr) FOR(l,k,upr){
  49. int s=1ll*tot[i][j][k]*tot[i][j][l]%mod*tot[i][k][l]%mod*tot[j][k][l]%mod,hhh=0;
  50. ans=(ans+1ll*s*val[i==j][j==k][k==l])%mod;
  51. }
  52. }
  53. printf("%d\n",ans);
  54. }

[CEOI2019]Cubeword(暴力)的更多相关文章

  1. P6845 [CEOI2019] Dynamic Diameter

    P6845 [CEOI2019] Dynamic Diameter 题意 一颗带权树,每次更改一条边的权,每次修改后求出最大直径.强制在线. 思路 \(O(n\log^2n)\) 的暴力做法. 根据经 ...

  2. zone.js - 暴力之美

    在ng2的开发过程中,Angular团队为我们带来了一个新的库 – zone.js.zone.js的设计灵感来源于Dart语言,它描述JavaScript执行过程的上下文,可以在异步任务之间进行持久性 ...

  3. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  4. HDU 5944 Fxx and string(暴力/枚举)

    传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Othe ...

  5. 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)

    湘潭邀请赛的一题,名字叫"超级FFT"最终暴力就行,还是思维不够灵活,要吸取教训. 由于每组数据总量只有1e5这个级别,和不超过1e6,故先预处理再暴力即可. #include&l ...

  6. fragment+viepager 的简单暴力的切换方式

    这里是自定义了一个方法来获取viewpager private static ViewPager viewPager; public static ViewPager getMyViewPager() ...

  7. 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 ...

  8. uoj98未来程序改 纯暴力不要想了

    暴力模拟A了,数据还是良(shui)心(shui)的 90分的地方卡了半天最后发现一个局部变量被我手抖写到全局去了,,, 心碎*∞ 没什么好解释的,其实只要写完表达式求值(带函数和变量的),然后处理一 ...

  9. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法

    15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...

随机推荐

  1. Windows10 下利用Hyper-V安装CentOS系统

    开启Windows10的Hyper-v功能(需要重启电脑) 控制面板→程序→启用或关闭Windows功能→打开Hyper-v→确定 创建虚拟机 在Windows管理工具中找到Hyper-v管理器并双击 ...

  2. IT兄弟连 Java语法教程 数组 经典案例

    案例需求: 编程实现双色球中奖号码的生成 1)应用知识: ●  数组的声明 ●  数组的使用 ●  for循环 2)需求解析: 在该程序中,需要定义一个长度为7的数组,用来存储中奖号码,使用Rando ...

  3. [转]探索ASP.NET Core 3.0 系列

    这是该系列的第一篇文章:探索ASP.NET Core 3.0. 第1部分-探索新的项目文件Program.cs和通用主机(本文) 第2部分-比较ASP.NET Core 3.0模板之间的Startup ...

  4. 通过对象方法获取委托_C#反射获取委托_

    前言:时间紧,先写关键代码,以后优化: 在此感谢其他博友分享的文章,参考文章:C#反射委托创建器 1-定义含有委托的类: public class TimeCycle { /// <summar ...

  5. c#日期和时间戳互转

    using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ...

  6. go-爬虫-百度贴吧(并发版)

    爬取百度贴吧的网页 非并发版 package main import ( "fmt" "io" "net/http" "os&qu ...

  7. Shell(三):echo、printf、test命令

    一.echo 1.显示普通字符串: echo "today is a wonderful day" 这里的双引号可以省略. 2.显示转义字符: echo "\" ...

  8. cmdb全总结

    1.什么是cmdb ,做什么的? 配置管理数据库 ,就是存储基础设施的信息配置使用的 简单说就是CMDB这个系统可以自动发现网络上的IT设备 ,并自动存储相关信息 ,像一台服务器有型号 厂商 系统 c ...

  9. selenium 优化 提升性能

    结果: 用时:7.200437545776367s用时:5.909301519393921s headless用时:4.924464702606201s headless\phone用时:4.9358 ...

  10. 关于 SONY WF1000XM3 在 Windows 10 下蓝牙连接只有 Handfree 没有 Stereo 模式

    应该是驱动适配问题,目前粗暴的解决方案貌似下载安装一个 Intel APTX 驱动就可以了: https://www.dell.com/support/home/cn/zh/cndhs1/driver ...