背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。
一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。

于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义。

比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词,分别为
(2个) aa,ab,
(26个)aaa,aab,aac...aaz,
(26个)aba,abb,abc...abz,
(25个)baa,caa,daa...zaa,
(25个)bab,cab,dab...zab。

这个只是很小的情况。而对于其他复杂点的情况,Lele实在是数不出来了,现在就请你帮帮他。

 
Input
本题目包含多组数据,请处理到文件结束。 每组数据占两行。 第一行有两个正整数N和L。(0<N<6,0<L<2^31) 第二行有N个词根,每个词根仅由小写字母组成,长度不超过5。两个词根中间用一个空格分隔开。
 
Output
对于每组数据,请在一行里输出一共可能的单词数目。 由于结果可能非常巨大,你只需要输出单词总数模2^64的值。
 
Sample Input
2 3
aa ab
1 2
a
 
Sample Output
104
52
 
 
和poj那个基本一样 ,,不过求A^1+A^2----A^n 有了花头 //之前一直以为白书上的是最简单的 没想到还有更简单的 。。
 
 
http://www.cnblogs.com/kuangbin/p/3159520.html   //代码看这里吧
 
 
 
还是附上我的代码吧=_=
 
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
typedef unsigned long long LL;
struct Mat
{
    LL mat[36][36];
    int n;
    Mat(int _n)
    {
        n=_n;
        memset(mat,0,sizeof(mat));
    }
    Mat operator *(const Mat &B)const
    {
        Mat C(n);
        for(int k=0; k<n; ++k)
            for(int i=0; i<n; ++i)
            {
                if(mat[i][k]==0)  continue;
                for(int j=0; j<n; ++j)
                {
                    if(B.mat[k][j]==0) continue;
                    C.mat[i][j]=C.mat[i][j]+mat[i][k]*B.mat[k][j];
                }
            }
        return C;
    }
    Mat operator ^(int k)
    {
        Mat C(n);
        for(int i=0; i<n; ++i) C.mat[i][i]=1;
        while(k)
        {
            if(k&1) C=C*(*this),--k;
            k>>=1;
            *this=(*this)*(*this);
        }
        return C;
    }
};
struct AC
{
    int ch[38][26],fail[38],val[38],sz,rt;
    void init()
    {
        sz=rt=0;
        memset(ch[rt],-1,sizeof(ch[rt]));
    }
    void insert(char *str)
    {
        int len=strlen(str),u=rt;
        for(int i=0; i<len; ++i)
        {
            if(ch[u][str[i]-'a']==-1)
            {
                ++sz;
                memset(ch[sz],-1,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][str[i]-'a']=sz;
            }
            u=ch[u][str[i]-'a'];
        }
        val[u]=1;
    }
    void build()
    {
        queue<int>Q;
        int u=rt;
        for(int i=0; i<26; ++i)
        {
            if(ch[u][i]==-1) ch[u][i]=rt;
            else
            {
                fail[ch[u][i]]=rt;
                Q.push(ch[u][i]);
            }
        }
        while(!Q.empty())
        {
            u=Q.front();
            Q.pop();
            val[u]|=val[fail[u]];
            for(int i=0; i<26; ++i)
            {
                if(ch[u][i]==-1) ch[u][i]=ch[fail[u]][i];
                else
                {
                    fail[ch[u][i]]=ch[fail[u]][i];
                    Q.push(ch[u][i]);
                }
            }
        }
    }
    Mat get()
    {
        Mat ret(sz+2);
        for(int i=0; i<=sz; ++i)
            for(int j=0; j<26; ++j)
                if(!val[ch[i][j]]) ++ret.mat[i][ch[i][j]];
        for(int i=0; i<=sz+1; ++i)
            ret.mat[i][sz+1]=1;
        return ret;
    }
} ac;
char s[55];
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ac.init();
        for(int i=0; i<n; ++i)
        {
            scanf("%s",s);
            ac.insert(s);
        }
        ac.build();
        Mat A=ac.get();
        A=A^m;
        LL res=0;
        for(int i=0; i<A.n; ++i)
            res+=A.mat[0][i];
        --res;
        A=Mat(2);
        A.mat[0][0]=26;
        A.mat[1][1]=A.mat[0][1]=1;
        A=A^m;
        Mat B(2);
        B.mat[0][0]=B.mat[1][0]=1;
        A=A*B;
        LL ans=A.mat[0][0];
        ans-=res+1;
        cout<<ans<<endl;
    }
}
 
 

hdu2243的更多相关文章

  1. 【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结

    题解:http://blog.csdn.net/xingyeyongheng/article/details/10005923 这里采用了二分法求等比数列前n项和. 等比数列前n项和也可以用矩乘快速幂 ...

  2. HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化

    题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. HDU-2243 考研路茫茫——单词情结(AC自动机)

    题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...

  4. hdu2243考研路茫茫——单词情结(ac+二分矩阵)

    链接 跟2778差不多,解决了那道题这道也不成问题如果做过基本的矩阵问题. 数比较大,需要用unsigned longlong 就不需要mod了 溢出就相当于取余 #include <iostr ...

  5. HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...

  6. POJ2778&HDU2243&POJ1625(AC自动机+矩阵/DP)

    POJ2778 题意:只有四种字符的字符串(A, C, T and G),有M中字符串不能出现,为长度为n的字符串可以有多少种. 题解:在字符串上有L中状态,所以就有L*A(字符个数)中状态转移.这里 ...

  7. hdu2243考研路茫茫——单词情结

    Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如&q ...

  8. hdu2243之AC自动机+矩阵乘法

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. HDU2243 考研路茫茫――单词情结

    Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab&q ...

  10. hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  2. JavaScript Array every()&some()&reduce()方法

    every()方法测试数组的所有元素是否都通过了指定函数的测试. // 每一项都要满足条件才会返回true,只要有一项不满足返回false var arr = [1, 2, 3, 4]; let bl ...

  3. MaxCompute Studio提升UDF和MapReduce开发体验

    原文链接:http://click.aliyun.com/m/13990/ UDF全称User Defined Function,即用户自定义函数.MaxCompute提供了很多内建函数来满足用户的计 ...

  4. JAVA学习之路 (五) 类

    java类的学习 先上一个代码 package bankCard; import java.util.Scanner; // 银行卡类 public class bankCard { // 静态变量 ...

  5. 关于Python的JSON

    1.json模块load/loads.dump/dumps区别:(摘自这里) 实际上json就是python字典的字符串表示,但是字典作为一个复杂对象是无法直接转换成定义它的代码的字符串,python ...

  6. P4370 [Code+#4]组合数问题2

    题目要求当\(0\leq a\leq b\leq n\)时,\(k\)个\(\tbinom{b}{a}\)的和的最大值 观察杨辉三角形,可以发现,最大的\(\tbinom{b}{a}\),为\(\tb ...

  7. RobotFrameWork 自动化环境搭建(基于 python3.6)

    一.需要安装的工具目录 安装 python3.6.0 我这里采用的是 python3.6 (目前慢慢市场在推广 python3.0 版本了) 安装 wxPython(Python 非常有名的一个GUI ...

  8. jmeter正则表达式提取多个数据/一组数据时,应该怎么做——debug sampler的使用

    背景:今天有个接口需要借助前面接口产生的一组ids数据,来作为入参使用,但是之前都是提取单个接口,所以到底怎么提取接口,遇到了很大的问题,按照多方查取资料都没有成功,最终在一个不相关帖子的最后一句话被 ...

  9. 服务器安装JDK

    1.卸载OpenJDK, 安装OracleJDK a.一般的LINUX发行版内置OpenJDK, 相当于JDK的开源版本(我们平时使用的JDK特指OracleJDK) b.OpenJDK 不能使用ja ...

  10. 什么才是Python的高级编程?大牛总结,绝对让你受益匪浅

    很多刚入门或者还在了解的小伙伴们都会遇到迷茫期吧,就是学完这些基础,函数,字典啥的,好像也做不了什么东西,其实你基础学的扎实的话,是能做很多的事的,学完基础也不要迷茫,因为每门语言都是博大精深的,不是 ...