\(\text{Problem}\)

给定一个由前 \(n\) 个小写字母组成的串 \(S\)。

串 \(S\) 是阶乘字符串当且仅当前 \(n\) 个小写字母的全排列(共 \(n!\) 种)都作为 \(S\) 的子序列(可以不连续)出现。

判断 \(S\) 是否是阶乘字符串

多组数据

\(\text{Analysis}\)

一个结论:

当 \(n > 21\) 时

\(\because |S| <= 450\)

\(\therefore C_{n}^{450} < n!\)

\(\therefore\) 结果为 \(NO\)

于是我们只需考虑 \(n \le 21\) 的情况

此时状压可行

设 \(f_s\) 表示字符串 \(S\) 中的一个位置,使得集合 \(s\) 中的字母的全排列都在 \([1,f_s]\) 中出现过

那么我们只需要看 \(f_{2^n-1}\) 是否合法

设 \(nxt_{i,j}\) 表示串 \(S\) 中位置 \(i\) 以后(不包括 \(i\)) \(j\) 出现的位置

则 \(f_s = \max_{i \in s} nxt[f_{s - 2 ^ i}][i]\)

\(\text{Code}\)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int MAXN = 21;
int T, n, len, nxt[455][26], f[1 << MAXN];
char s[455]; inline int solve()
{
memset(nxt, 0x3f3f3f3f, sizeof nxt), memset(f, 0, sizeof f);
len = strlen(s + 1);
for(int j = 0; j <= len + 1; j++)
for(int k = 0; k < 26; k++) nxt[j][k] = len + 1;
for(int j = len; j >= 0; j--)
{
for(int k = 0; k < 26; k++) nxt[j][k] = nxt[j + 1][k];
nxt[j][s[j + 1] - 'a'] = j + 1;
}
for(int i = 1; i < (1 << n); i++)
{
for(int j = 0; j < n; j++)
if (i & (1 << j)) f[i] = max(f[i], nxt[f[i - (1 << j)]][j]);
}
return f[(1 << n) - 1] != len + 1;
} int main()
{
scanf("%d", &T);
for(int i = 1; i <= T; i++)
{
scanf("%d%s", &n, s + 1);
if (n > 21){printf("NO\n"); continue;}
if (solve()) printf("YES\n");
else printf("NO\n");
}
}

JZOJ 3293. 【SHTSC2013】阶乘字符串的更多相关文章

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

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

  2. 洛谷 P3989 [SHOI2013]阶乘字符串 解题报告

    P3989 [SHOI2013]阶乘字符串 题目描述 给定一个由前\(n(\le 26)\)个小写字母组成的串\(S(|S|\le 450)\).串\(S\)是阶乘字符串当且仅当前 \(n\) 个小写 ...

  3. BZOJ 4416 【SHOI2013】 阶乘字符串

    题目链接:阶乘字符串 又是一道不会做的题……看了题解后我被吓傻了…… 首先我们可以有一个显然的\(O(2^nn)\)的做法.我们先预处理出\(g_{i,j}\)表示字符串中\(i\)号位置开始第一个\ ...

  4. [SHOI2013]阶乘字符串

    题目描述 给定一个由前\(n\)个小写字母组成的串\(S\). 串\(S\)是阶乘字符串当且仅当前\(n\)个小写字母的全排列(共\(n!\)种)都作为\(S\)的子序列(可以不连续)出现. 由这个定 ...

  5. 【JZOJ3293】【BZOJ4416】【luoguP3989】阶乘字符串

    description 给定一个由前n个小写字母组成的串S. 串S是阶乘字符串当且仅当前n个小写字母的全排列(共n!种)都作为S的子序列(可以不连续)出现. 由这个定义出发,可以得到一个简单的枚举法去 ...

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

    可以大胆猜想n>21时无解,至于依据,不开O2,1s,n<=21刚好能卡过去= = 并不会证= = #include<cstdio> void up(int& a,in ...

  7. BZOJ4416 [Shoi2013]阶乘字符串 【序列自动机 + 状压dp】

    题目链接 BZOJ4416 题解 建立序列自动机,即预处理数组\(nxt[i][j]\)表示\(i\)位置之后下一个\(j\)出现的位置 设\(f[i]\)表示合法字符集合为\(i\)的最短前缀,枚举 ...

  8. [BZOJ4416][SHOI2013]阶乘字符串(子集DP)

    怎么也没想到是子集DP,想到了应该就没什么难度了. 首先n>21时必定为NO. g[i][j]表示位置i后的第一个字母j在哪个位置,n*21求出. f[S]表示S的所有全排列子序列出现的最后末尾 ...

  9. BZOJ4416 SHOI2013阶乘字符串(状压dp)

    当n大到一定程度(>21)时一定无解,并不会证. 如果要取出一个排列,显然应该让每一位在序列中的位置尽量靠前.于是设f[S]表示存在S子集中这些字母所组成的所有排列的最短前缀的长度,枚举当前排列 ...

  10. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 关于linux fcitx输入法候选词中含有省略号的问题解决

    前言 这几天舍弃了 sogou 输入法,换上了google拼音输入法,因为我在纯文本终端调用中文输入法,搜狗显示出来的是加密的,候选词都是加密的,很烦这种 问题原因 这个问题主要是因为 云拼音 模块凉 ...

  2. 漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议

    面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 博主的上篇连载文章<初识图像处理技术> 图像 ...

  3. ATM项目

    ATM项目实战 项目需求分析: 1.注册(密码要加密) 2.登陆 3.查看余额 4.提现(可自定手续费) 5.还款 6.转账 7.查看流水 8.添加购物车功能 (商品可配置) 9.查看购物车功能 10 ...

  4. 推荐一款 在线+离线数据 同步框架 Dotmim.Sync

    移动智能应用可以分为在线模式.纯离线模式与"在线+离线"混合模式.在线模式下系统数据一般存储在服务器端的大中型数据库(如 SQL Server.Oracle.MySQL 等),移动 ...

  5. ABP AutoMapper与自定义Mapping

    对象映射 在工作中,需要将相似的对象映射到另一个对象,这样我们来看一个最繁琐的映射方式 例: public class UserAppService : ApplicationService { pr ...

  6. python运算符与基本数据类型

    Python种类 JavaPython cPython ***** pypy 字节码 和 机器码 Python程序: 1. 终端: C:\python35\python.exe D:\1.py 解释器 ...

  7. avue属性详解和使用介绍

    官方文档:https://www.avuejs.com/form/form.html <template> <!-- 基础组件 --> <basic-container& ...

  8. html排版,样式

    <style>         .box{             width: 600px;             height: 800px;             backgro ...

  9. Spring之Bean注入Spring容器中的方式

    向spring容器中加入bean有以下方式: 通过<Bean>标签 @Configuration + @Bean @Component + 组件扫描 @Import导入[见 Spring注 ...

  10. 网络安全之frp内网穿透

    前言 内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机 环境需求 一台公网服务器(linux操作系统) ...