膜拜了Claris大。

首先可以得到当n>21时无解。

令g[i][c]表示i之后第一个为c的字母的下标。

令i为用二进制表示的已经选取的字母的集合,令f[i]表示选取的字母的集合的全排列都出现的最短的原串的前缀的长度。然后枚举字母转移。显然当且仅当f[2^n-1]<=字符串长度时有解。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;int n,len,bin[25],f[2500005],g[1005][26]; char ch[1005];
int main(){int cas,i,k; scanf("%d",&cas);bin[0]=1; for (i=1; i<=21; i++) bin[i]=bin[i-1]<<1;while (cas--){scanf("%d%s",&n,ch+1); len=strlen(ch+1);if (n>21){ puts("NO"); continue; }for (i=0; i<n; i++) g[len][i]=g[len+1][i]=len+1;for (i=len; i; i--){for (k=0; k<n; k++) g[i-1][k]=g[i][k];g[i-1][ch[i]-'a']=i;}for (i=1; i<bin[n]; i++)for (f[i]=k=0; bin[k]<=i; k++)if (i&bin[k]) f[i]=max(f[i],g[f[i^bin[k]]][k]);puts((f[bin[n]-1]<=len)?"YES":"NO");}return 0;
}

by lych

2016.3.7

bzoj4416 阶乘字符串 子集dp相关推荐

  1. [BZOJ4416][Shoi2013]阶乘字符串 状态压缩dp

    诶一直感觉这个数字特别大的时候会无解 然而一直没有把这个数算出来,觉得可能是大于一个数无解小于一个数暴力 然而看题解发现这个数字是2121 正解先特判nn是否大于2121,若大于puts no 否则进 ...

  2. 【BZOJ4416】阶乘字符串(SHOI2013)-状压DP

    测试地址:阶乘字符串 做法:本题需要用到状压DP. 首先,根据证明(直觉),满足条件的字符串的最小长度仅仅比n2n2n^2小一点点,因此当n>21n>21n>21时,直接输出NO即可 ...

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

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

  4. BZOJ4416: [Shoi2013]阶乘字符串

    BZOJ4416: [Shoi2013]阶乘字符串 状压dp 题解: 据说n>21n>21无解? 据说合法的串最短是O(n2)O(n^2)级别的? 不知道... 对于n<=21n的情 ...

  5. [JZOJ3293] 【SHTSC2013】阶乘字符串

    题目 题目大意 给你一个字符串,判断这个字符串是否为"阶乘字符串". 就是子序列包含字符集的全排列的字符串. n≤26n\leq 26n≤26 ∣S∣≤450|S|\leq 450 ...

  6. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  7. BZOJ 2560(子集DP+容斥原理)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 757  Solved: 497 [Submit][Status][Discuss ...

  8. BZOJ4416 [Shoi2013]阶乘字符串

    鬼畜题啊-- 上来看错题,看成子串,n>=6直接无解,n<=5直接暴力,然后狂WA,发现看错题了 然后就跪了,只好上网找题解,然后看到了一个非常厉害的结论:当n>21的时候无解! 好 ...

  9. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

    传送门 文章目录 题意: 思路: 题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起.再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了. 定义f[i]f[i ...

最新文章

  1. uniapp商城_【程序源代码】商城小程序
  2. 提升销售人员的信息处理能力
  3. 使用PYTORCH复现ALEXNET实现MNIST手写数字识别
  4. 粒子群算法组卷_粒子群(PSO)算法概念及代码实现
  5. 简单的C语言程序合集
  6. cuda的shared momery
  7. C++ opengl 线段的绘制
  8. java github关联登录_没错,用三方Github做授权登录就是这么简单!(OAuth2.0实战)...
  9. Report machine 单据报表设计
  10. [网络通信协议]websocket
  11. 《Flash MX培训教程》前言
  12. java adt eclipse_在eclipse中添加android ADT
  13. 来了!微信小程序五款最受欢迎的UI框架解读
  14. 离散小波变换wavedec matlab,matlab小波变换指令及其功能介绍.docx
  15. sensor gyro_3d not found
  16. 记录一次获取车载摄像头数量为0同时打开摄像头黑屏的问题分析(基于Android M)
  17. Android安全之使用root权限绕过检测机制,强行自动允许应用的悬浮窗/应用后台弹出界面等权限
  18. 威海之恋 mv和歌词
  19. E20170513-hm
  20. 国外程序员推荐:每个程序员都应读的书

热门文章

  1. 何为数据库连接池?其工作原理是什么?
  2. git pull 和 git fecth 的区别
  3. ice通信原理_通信原理_知到网课答案
  4. 递归函数——上台阶问题
  5. 梯度下降、牛顿法、拟牛顿法
  6. 算法细节系列(3):梯度下降法,牛顿法,拟牛顿法
  7. MaxEnt运行报错的各种问题及解决方法
  8. EXCEL表格-“魔法操作”之智能填充(数据提取)
  9. select下拉框选择触发事件
  10. 计算机故障维修要遵循什么原则,超级实用的六条法则教你快速搞定电脑故障维修!...