测试地址:阶乘字符串
做法:本题需要用到状压DP。
首先,根据证明(直觉),满足条件的字符串的最小长度仅仅比n2n2n^2小一点点,因此当n>21n>21n>21时,直接输出NO即可。
于是我们就把nnn缩减到了21" role="presentation" style="position: relative;">212121的范围,就可以考虑状压了。令f(i)f(i)f(i)为包含集合iii的所有全排列的最短前缀,而nxt(i,j)" role="presentation" style="position: relative;">nxt(i,j)nxt(i,j)nxt(i,j)为第iii个字符后第一个字符j" role="presentation" style="position: relative;">jjj的位置,那么有:
f(i)=max{nxt(f(i−{x}),x)|x∈i}f(i)=max{nxt(f(i−{x}),x)|x∈i}f(i)=\max\{nxt(f(i-\{x\}),x)|x\in i\}
上式的含义是,枚举集合iii内的一个字符x" role="presentation" style="position: relative;">xxx,求包含以字符xxx结尾,前面为其余字符的全排列的最短前缀,那么这些条件都要满足的话,答案显然就是它们的最大值。于是我们求出f(S)" role="presentation" style="position: relative;">f(S)f(S)f(S)(SSS为字符集)后,判断一下它是不是不超过字符串长度即可,时间复杂度为O(n2n)" role="presentation" style="position: relative;">O(n2n)O(n2n)O(n2^n)。
以下是本人代码:

#include <bits/stdc++.h>
using namespace std;
int T,n,len,nxt[460][22],f[2200000];
char s[460];int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);scanf("%s",s);len=strlen(s);if (n>21){printf("NO\n");continue;}for(int i=0;i<n;i++)nxt[len][i]=len;for(int i=len-1;i>=0;i--){for(int j=0;j<n;j++)nxt[i][j]=nxt[i+1][j];nxt[i][s[i]-'a']=i;}int now=0;for(int i=1;i<(1<<n);i++){if (i==(1<<now)){f[i]=nxt[0][now];now++;continue;}f[i]=0;for(int j=0;j<n;j++)if (i&(1<<j))f[i]=max(f[i],nxt[f[i^(1<<j)]][j]);}if (f[(1<<n)-1]<len) printf("YES\n");else printf("NO\n");}return 0;
}

【BZOJ4416】阶乘字符串(SHOI2013)-状压DP相关推荐

  1. BZOJ 4416: [Shoi2013]阶乘字符串【状压DP

    --不那么裸的状压dp-- 当字符集大于21的时候直接输出不满足--原因啊----大了就跑不过了  --大概就是不能得到嘛[大佬们并没有讨论出结果在下只是听的题解[x 用f[i][j]表示第i个字符前 ...

  2. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  3. CF-1238E. Keyboard Purchase (状压dp)

    CF-1238E. Keyboard Purchase (状压dp) 题目链接 题意 长度nnn的字符串为排成一行,这个字符串由mmm个字符组成,你需要确定一种排列方式使得这个字符串的花费最少. 花费 ...

  4. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  5. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  6. HDU - 2825 Wireless Password(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...

  7. [学习笔记]状压dp

    状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...

  8. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][ ...

  9. UVA-10817- Headmaster's Headache(状压DP)

    UVA-10817- Headmaster's Headache 题意: 这间学校开设S门课,给出校长已经有的师资n,然后再给出m个应聘者,每门课至少有两名任课老师,求最少需要的雇佣工资. 分析: 这 ...

最新文章

  1. 常用 CSS 选择器
  2. 2021春季学期-创新设计与实践-Lesson4
  3. html中<pre>标签
  4. 【shell】 初次接触shell编程,记录一下遇到的问题
  5. app中使用用户名/邮箱/手机号登录的思路分析
  6. 小米12系列有望于双12当天发布:贴合命名 争取骁龙8G1首发
  7. 调查:Blackberry开发者中国大版图
  8. python select网络编程详细介绍
  9. OpenGL图形学中的DDA算法
  10. java实现网站的访问量_如何实现对网站页面访问量的统计(javaweb和php)
  11. 英语报纸计算机类,报纸和电脑英语作文
  12. 蓝桥杯快到了,Java的这些常用方法一定要知道
  13. 自学python网站-python自学网站
  14. wifi上行下行速度测试_怎么测试上行速度,直观的测试 WiFi上下行宽带
  15. warning: ISO C forbids an empty translation unit [-pedantic]
  16. Android 判断是否安装应用宝,并跳到应用中去
  17. 微信点餐系统——用Enum枚举来保存商品状态
  18. Mybatis和MybatisPlus3.4的使用
  19. 金蝶EAS,GUI客户端,编辑界面常用方法,框架方法示例
  20. 谷歌Chrome浏览器中如何打开或关闭网页的自动翻译功能

热门文章

  1. 163邮箱免费账号注册,163邮箱申请能免费注册吗?
  2. 我们问了人工智能ChatGPT十个运维问题,结果发现...
  3. js第13天(事件绑定方式)
  4. js中事件绑定的几种方式
  5. kotlin-协程-lzf
  6. I Need Some Sleep / Eels
  7. 扩展欧几里得的几个定理以及证明
  8. oracle vba 数组_vba 数据库目录
  9. Ubuntu 18.04 安装搜狗拼音
  10. docker创建容器共享目录