题意

小豆参加了生物实验室。在实验室里,他主要研究蛋臼质。他现在研究的蛋臼质是由k个氨基酸按一定顺序构成的。每一个氨基酸都可能有a种碱基序 列si_j 构成。现在小豆有一个碱基串s,小豆想知道在这个碱基上都多少中不同的组合方式可能得到这个蛋白质。即求由k段字符串有序合并成的字符串s1,有多少种不同方式能够匹配字符串s,其中k段字符串的选法不同,或者与s匹配上的位置不同认为是不同的方式。

\(1 ≤ k ≤ 100, |s| ≤ 10000,a_i ≤ 10\)

分析

参照scarlyw的题解。

我们定义\(f[i][j]\)表示枚举到第\(i\)个串,当前匹配到\(s\)的第\(j\)位的方案数,那么每一次只需要将第\(i\)段中的每一个可能串和\(s\)做匹配,然后将匹配上的位置转移一下就可以了,边界就是\(f[0][i],0 \leq i \leq len\)全部置为\(1\)就可以了,时间复杂度\(O(k*a_i*|s|)\)

(PS:原题没有标注取模,但是实际上有模1000000007)

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
    rg T data=0;
    rg int w=1;
    rg char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        data=data*10+ch-'0';
        ch=getchar();
    }
    return data*w;
}
template<class T>il T read(rg T&x)
{
    return x=read<T>();
}
typedef long long ll;

co int S=1e4+1,N=101,mod=1e9+7;
int f[N][S],p[S];
char s[S],t[S];

void add(int&x,int t)
{
    x+=t,x>=mod?x-=mod:x;
}

void get_fail(char s[],int len)
{
    int j=p[1]=0;
    for(int i=2;i<=len;++i)
    {
        while(j&&s[j+1]!=s[i])j=p[j];
        if(s[j+1]==s[i])++j;
        p[i]=j;
    }
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    int n=read<int>();scanf("%s",s+1);int len=strlen(s+1);
    std::fill(f[0],f[0]+len+1,1);
    for(int c=1;c<=n;++c)
    {
        int k=read<int>();
        while(k--)
        {
            scanf("%s",t+1);int sl=strlen(t+1);get_fail(t,sl);
            int j=0;
            for(int i=1;i<=len;++i)
            {
                while(j&&t[j+1]!=s[i])j=p[j];
                if(t[j+1]==s[i])
                {
                    ++j;
                    if(j==sl)
                        add(f[c][i],f[c-1][i-sl]),j=p[j];
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=len;++i)
        add(ans,f[n][i]);
    printf("%d\n",ans);
    return 0;
}

BZOJ5337 [TJOI2018]str的更多相关文章

  1. 【BZOJ5337】[TJOI2018]str(动态规划,哈希)

    [BZOJ5337][TJOI2018]str(动态规划,哈希) 题面 BZOJ 洛谷 题解 就很呆... 显然按层\(dp\),如果能够匹配上就进行转移,直接哈希判断是否能够匹配就好了... #in ...

  2. bzoj 5337 [TJOI2018] str

    bzoj 5337 [TJOI2018] str Link Solution 水题 直接 \(f[i][j]\) 表示以第 \(i\) 位为结束位置,当前已经匹配了前 \(j\) 个氨基酸的方案数 使 ...

  3. BZOJ5337 [TJOI2018] 碱基序列 【哈希】【动态规划】

    题目分析: 这道题的难点在于要取模,而题面没有写. 容易想到一个O(1E7)的dp.KMP或者哈希得到相关位置然后对于相关位置判断上一个位置有多少种情况. 代码: #include<bits/s ...

  4. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  5. loj2576 「TJOI2018」str

    link 题意: 给一个模板串s和n个模式串,每个模式串有$a_i$种可取的串.现在要将n个模式串每个任取一种它可取的串,连接起来,记为串t,那么这种连接方式对答案的贡献为t在s中出现的次数.问所有连 ...

  6. 「TJOI2018」str

    碱基序列 题目描述 小豆参加了生物实验室.在实验室里,他主要研究蛋白质.他现在研究的蛋白质是由$k$个氨基酸按一定顺序构成的.每一个氨基酸都可能有$a$种碱基序列$s_{i,j}$构成. 现在小豆有一 ...

  7. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  8. python中的str,unicode和gb2312

    实例1: v1=u '好神奇的问题!?' type(v1)->unicode v1.decode("utf-8")# not work,because v1 is unico ...

  9. LDR、STR指令

    LDR(load register)指令将内存内容加载入通用寄存器 STR(store register)指令将寄存器内容存入内存空间中 #define GPJ0CON 0xE0200240 _sta ...

随机推荐

  1. Python3.x:Linux下退出python命令行

    Python3.x:Linux下退出python命令行 退出命令: quit() #或者 exit() #或者 Ctrl-D

  2. 机器学习中的numpy库

            日常学习中总是遇到数据需要处理等问题,这时候我们就可以借助numpy这个工具来做一些有意思的事. 1.生成随机数的几种方式 x=np.random.random(12) ###生成12 ...

  3. DCU Streamer Prefetcher

    DCU Streamer Prefetcher数据高速缓存单元预取流设置.如果设置为Enabled,会预取流并发送到它的一级缓存,以改善数据处理和系统性能,所以建议选择Enabled.选项:Enabl ...

  4. LeetCode——Number Complement

    LeetCode--Number Complement Question Given a positive integer, output its complement number. The com ...

  5. jQuery.fn.extend() jQuery.extend()

    是jQuery为开发插件提拱了两个方法 jQuery.fn jQuery.fn = jQuery.prototype = { init: function( selector, context ) { ...

  6. Mac 使用技巧分享

    1. 快捷键开启speech功能: System Preferences -> Ditaction&Speech ->Text to Speech ->Select 'Spe ...

  7. JAVA实现IP地址解析

    转载至:http://blog.csdn.net/dragontang/article/details/4151660 http://www.iteye.com/topic/340548#

  8. PAT1037. Magic Coupon (25)

    #include <iostream> #include <algorithm> #include <vector> using namespace std; in ...

  9. Dos命令的巧用 - 转载

    Dos命令的巧用 豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可 ...

  10. crontab 参数详解

    crontab 参数 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute ...