zoukankan      html  css  js  c++  java
  • [状压DP]JZOJ 3293 阶乘字符串

    Description

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

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

    由这个定义出发,可以得到一个简单的枚举法去验证,但是它实在太慢了。所以现在请你设计一个算法,在1秒内判断出给定的串是否是阶乘字符串。
     

    Input

    输入第1行一个整数T,表示这个文件中会有T组数据。

    接下来分T个块,每块2行:

    第1行一个正整数n,表示S由前n个小写字母组成。

    第2行一个字符串S。

    Output

    对于每组数据,分别输出一行。每行是YES或者NO,表示该数据对应的串S是否是阶乘字符串。
     

    Sample Input

    2
    2
    bbaa
    2
    aba

    Sample Output

    NO
    YES
     

    Data Constraint

     

    Hint

    样例解释:

    第一组数据中,ab这个串没有作为子序列出现。

    分析

    看这个数据和字符串这个关键字,我只往构造最优字符串然后匹配的方向想了……结果比完赛看见个bit和DP的标签

    我们设f[S]为状态为S的字母在串中构成了阶乘字符串的最靠前的位置

    那么转移为f[S]=max{g[f[S^(1<<j)][j]} (1<<j)&S>0

    g[i][j]表示从第i+1个位置开始第一个j的位置

    那么最后判断f[(1<<n)-1]是否超出了字符串的范围(需要预先设边界条件)即可

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    using namespace std;
    int T,n,mxb;
    int f[2097152],g[460][26];
    string s;
    
    int main() {
        for (scanf("%d",&T);T;T--) {
            scanf("%d",&n);
            cin>>s;
            mxb=1<<n;
            int len=s.length();
            if (n>21) {
                printf("NO
    ");
                continue;
            }
            for (int i=0;i<n;i++) g[len][i]=g[len+1][i]=len+1;
            for (int i=len;i;i--) {
                for (int j=0;j<n;j++) g[i-1][j]=g[i][j];
                g[i-1][s[i-1]-'a']=i;
            }
            memset(f,0,sizeof f);
            for (int i=1;i<mxb;i++)
                for (int j=0;j<n;j++)
                    if (i&(1<<j)) f[i]=max(f[i],g[f[i^(1<<j)]][j]);
            if (f[mxb-1]<=len) printf("YES
    ");
            else printf("NO
    ");
        } 
    }
    View Code
    在日渐沉没的世界里,我发现了你。
  • 相关阅读:
    spring分布式事务学习笔记
    大家说说看针对微信的这个限制,如何吐槽????
    Easy-Mock 一个H5前端接口模拟神器
    CSS设计模式之三权分立模式篇 ( 转)
    引爆你的Javascript代码进化 (转)
    基于jQuery的软键盘
    基于jQuery的数字键盘插件
    支持触屏的zepto轮播图插件
    支持触屏的jQuery轮播图插件
    基于CSS3的3D旋转效果
  • 原文地址:https://www.cnblogs.com/mastervan/p/11123241.html
Copyright © 2011-2022 走看看