[JZOJ3293] 【SHTSC2013】阶乘字符串
题目
题目大意
给你一个字符串,判断这个字符串是否为“阶乘字符串”。
就是子序列包含字符集的全排列的字符串。
n≤26n\leq 26n≤26 ∣S∣≤450|S|\leq 450∣S∣≤450
思考历程
首先,设toi,chto_{i,ch}toi,ch表示iii后面遇到的第一个chchch(字符)的位置。
这个东西很好预处理。搞出之后可以看成一张图。
那么我们就可以搞出最裸的暴力:枚举全排列,在图上跑,找一找是否有这样的路径。
显然,当前选的字母一定是越早越好,这样后面就能有更多的选择。所以这个方法是正确的。
从000开始在图上跑,每次走没有走过的字母,直至走出一条长度为nnn的路径。显然图上的每一条这样的路径都是唯一的。
于是我就试着求出这些路径条数,即为子序列包含的全排列字符串的个数。
状压DP:设fi,sf_{i,s}fi,s表示到iii,出现过的字符的集合为sss的方案。
这样跑一跑显然是会超时的。所以我就试着折半搜索,大大减少了时间复杂度。
但是还是有点大……其中sss还比较难存,所以我打了map。
然而最终……30分……
和人家暴力的分数一模一样……
应该是常数过大吧……
正解
也是状压DP,设fsf_{s}fs表示sss集合中的字符的全排列全部出现时的最前的位置。
转移的时候枚举k∈Sk\in Sk∈S,然后从fs−{k}f_{s-\{k\}}fs−{k}转移过来,方程显然。
预处理的那个数组还是要的。
但是2262^{26}226很大……
有个很强大的结论:如果n>21n>21n>21,则450450450的长度以内没有答案。
具体证明……我不会,网上也没有……
我只知道最短长度是O(n2)O(n^2)O(n2)级别的,但是不知道怎么求……
所以应该预估一下时间复杂度,发现跑不过去,大胆猜想,从而得出这个结论
代码
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
#define INF 0x7f7f7f7f
int n,len;
char lis[453];
int to[453][26];
int f[1<<21|1];
int main(){
freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while (T--){
scanf("%d%s",&n,lis+1);
if (n>21){
printf("NO\n");
continue;
}
len=strlen(lis+1);
memset(to,0,sizeof to);
for (int i=0;i<=len;++i){
for (int j=i+1,k=0;j<=len && k<n;++j)
if (!to[i][lis[j]-'a'])
to[i][lis[j]-'a']=j,k++;
for (int j=0;j<n;++j)
if (!to[i][j])
to[i][j]=INF;
}
memset(f,0,sizeof f);
f[0]=0;
for (int i=1;i<(1<<n);++i)
for (int j=0;j<n;++j)
if (i>>j&1)
f[i]=(f[i^1<<j]==INF?INF:max(f[i],to[f[i^1<<j]][j]));
if (f[(1<<n)-1]==INF)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
总结
论大胆猜想的重要性……
[JZOJ3293] 【SHTSC2013】阶乘字符串的更多相关文章
- 【JZOJ3293】【BZOJ4416】【luoguP3989】阶乘字符串
description 给定一个由前n个小写字母组成的串S. 串S是阶乘字符串当且仅当前n个小写字母的全排列(共n!种)都作为S的子序列(可以不连续)出现. 由这个定义出发,可以得到一个简单的枚举法去 ...
- 洛谷 P3989 [SHOI2013]阶乘字符串 解题报告
P3989 [SHOI2013]阶乘字符串 题目描述 给定一个由前\(n(\le 26)\)个小写字母组成的串\(S(|S|\le 450)\).串\(S\)是阶乘字符串当且仅当前 \(n\) 个小写 ...
- BZOJ 4416 【SHOI2013】 阶乘字符串
题目链接:阶乘字符串 又是一道不会做的题……看了题解后我被吓傻了…… 首先我们可以有一个显然的\(O(2^nn)\)的做法.我们先预处理出\(g_{i,j}\)表示字符串中\(i\)号位置开始第一个\ ...
- [SHOI2013]阶乘字符串
题目描述 给定一个由前\(n\)个小写字母组成的串\(S\). 串\(S\)是阶乘字符串当且仅当前\(n\)个小写字母的全排列(共\(n!\)种)都作为\(S\)的子序列(可以不连续)出现. 由这个定 ...
- BZOJ4416: [Shoi2013]阶乘字符串
可以大胆猜想n>21时无解,至于依据,不开O2,1s,n<=21刚好能卡过去= = 并不会证= = #include<cstdio> void up(int& a,in ...
- BZOJ4416 [Shoi2013]阶乘字符串 【序列自动机 + 状压dp】
题目链接 BZOJ4416 题解 建立序列自动机,即预处理数组\(nxt[i][j]\)表示\(i\)位置之后下一个\(j\)出现的位置 设\(f[i]\)表示合法字符集合为\(i\)的最短前缀,枚举 ...
- [BZOJ4416][SHOI2013]阶乘字符串(子集DP)
怎么也没想到是子集DP,想到了应该就没什么难度了. 首先n>21时必定为NO. g[i][j]表示位置i后的第一个字母j在哪个位置,n*21求出. f[S]表示S的所有全排列子序列出现的最后末尾 ...
- BZOJ4416 SHOI2013阶乘字符串(状压dp)
当n大到一定程度(>21)时一定无解,并不会证. 如果要取出一个排列,显然应该让每一位在序列中的位置尽量靠前.于是设f[S]表示存在S子集中这些字母所组成的所有排列的最短前缀的长度,枚举当前排列 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
随机推荐
- 20130324 LBP CSLBP 全局存储区 局部存储区 char c[]=”hello world”和char *str=”hello world”的区别
1.LBP and CSLBP 2.再论char c[]=”hello world”和char *str=”hello world”的区别 /**************代码1************ ...
- 8分钟带你深入浅出搞懂Nginx
Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道. 反向代 ...
- 6-MySQL高级-索引
索引 1. 思考 在图书馆中是如何找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询操作时有1次写的操作), 而且插入操作和更新操作很少出现性能问题, 遇到最多.最容易出 ...
- Selenium(一)---Selenium的安装和使用
一.前言 最近在帮一个老师爬取网页内容,发现网页是动态加载的,为了拿到全部的网页数据,这里使用到了Selenium.Selenium 是一个用于Web应用程序测试的工具,它可以模拟真实浏览器,支持多种 ...
- Eclipse指定JDK版本
Eclipse有好多版本,同时又分32位和64位,要使用相对应的版本和一样位数的JDK,Eclipse才能正常运行. 对应不上时,Eclipse 甚至不能正常启动.报错:“Failed to load ...
- Mysql优化-字段设计
摘抄并用于自查笔记 1. 对精度有要求decimal float 类型用于表示单精度浮点数值,而double类型用于表示双精度浮点数值,float 和 double 都是浮点型,而 decimal 是 ...
- TFS 忽略 文件
原文链接:http://ju.outofmemory.cn/entry/258689 让TFS忽略packages文件夹的更改 很多时候我们需要使用 Nuget 进行包管理,这时在我们的解决方案文件夹 ...
- .net 接受请求过来的流
//接收POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024 ...
- Java 局部变量
Java 局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局部变量: 局部变量只在声明 ...
- Windows中的"簇"和Linux中的"块"是对应的
扇区是对硬盘而言,块是对文件系统而言. 簇”又称为“分配单元” ,文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT 16/32/NTFS)打开文 ...