\(\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");
}
}

最新文章

  1. ios 关于问题 no matching provisioning profiles found
  2. CART(分类回归树)
  3. 总结asp.net页面跳转
  4. Android优化—— 内存分析工具 MAT 的使用
  5. 如何用ASPxTreeView建立三级树(显示及数据绑定)
  6. PHPCMS建站经验分享
  7. 9 I/O复用
  8. Oracle数据库配置方式二--使用Net Manager配置数据库
  9. pubwin 客户端会员无法自助结账的排查方法
  10. su Authentication failure解决
  11. 201521123068 《java程序设计》 第11周学习总结
  12. 使用hue查看hdfs系统报无法访问:/user/hadoop。 Note: you are a Hue admin but not a HDFS superuser, &quot;hdfs&quot; or part of HDFS supergroup, &quot;supergroup&quot;.
  13. docker 安装 mongodb
  14. jconsole连接本地进程报安全连接失败
  15. 20175312 2018-2019-2 《Java程序设计》第7周学习总结
  16. Mybatis-java.lang.RuntimeException: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in sqlmap/User.xml ### Cause: org.apache.ibatis.builder.B
  17. 【kafka】设置指定topic和group_id消耗的offset
  18. ts中的类的定义,继承和修饰符
  19. linux命令(39):shell 打印偶数行,奇数行 ,行号
  20. git log 查找

热门文章

  1. 《浅谈亚 log 数据结构在 OI 中的应用》阅读随笔
  2. 01.Typora基本使用
  3. CGI、WSGI、uWSGI、ASGI……
  4. 二阶段目标检测网络-FPN 详解
  5. js四舍五入保留两位小数的方法
  6. SSM基础学习笔记
  7. Python Excel 追加数据
  8. day03-Spring管理Bean-IOC-01
  9. Mysql--回顾提要
  10. string 类的用法