Problem Description
背单词,始终是复习英语的重要环节。在荒废了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
Author
linle
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<iomanip>
#define ll unsigned __int64
using namespace std;ll N,L,e;
char ts[10][10],s[10];
//int nextt[10],match[10];
//bool visit[10];
//bool kmp(char sa[],char sb[])
//{
//    nextt[1] = 0;
//    int i,j,k,l1 = strlen(sa+1),l2 = strlen(sb+1);
//    for(i = 2;i<=l1;i++)
//    {
//        ll t = nextt[i-1];
//        while(t&&sa[i]!=sa[t+1]) t = nextt[t];
//        if(sa[i] == sa[t+1]) t++;
//        nextt[i] = t;
//    }
//    match[0] = 0;
//    for(i = 1;i<=l2;i++)
//    {
//        ll t = match[i-1];
//        while(t&&sb[i]!=sa[t+1]) t = nextt[t];
//        if(sb[i] == sa[t+1]) t++;
//        match[i] = t;
//        if(t == l1) return 1;
//    }
//    return 0;
//}
struct mtr
{ll an[100][100];
};
mtr tmmmt;
mtr mul(mtr a,mtr b)
{mtr c;memset(c.an,0,sizeof(c.an));int i,j,k;for(i = 0;i<e;i++)for(j = 0;j<e;j++)for(k = 0;k<e;k++)c.an[i][j] += a.an[i][k]*b.an[k][j];return c;
}
mtr mpow(mtr a,ll t)
{mtr r;int i,j;memset(r.an,0,sizeof(r.an));for(i = 0;i<e;i++)r.an[i][i] = 1;while(t){if(t%2) r = mul(r,a);a = mul(a,a);t/=2;}return r;
}
struct node
{node* nextt[26],*fail;ll num;node(){for(ll i = 0;i<26;i++)nextt[i] = NULL;fail = NULL;num = e;}
};
node* root;
void insert()
{ll l = strlen(s),i;node* k = root;for(i = 0;i<l;i++){ll id = s[i]-'a';if(k->nextt[id] == NULL){k->nextt[id] = new node();if(i != l-1) e++;}k = k->nextt[id];}k->num = 0;
}
void build()
{queue<node*> q;node* k = root;for(ll i = 0;i<26;i++)if(k->nextt[i]!=NULL){k->nextt[i]->fail = k;q.push(k->nextt[i]);}while(!q.empty()){node* k = q.front();q.pop();for(ll i = 0;i<26;i++)if(k->nextt[i] != NULL){node* t = k->fail;while(t!=root&&t->nextt[i] == NULL) t = t->fail;if(t->nextt[i]!=NULL) t = t->nextt[i];k->nextt[i]->fail = t;q.push(k->nextt[i]);}}
}void ask()
{queue<node*> q;q.push(root);while(!q.empty()){node* k = q.front();q.pop();ll a = k->num;if(a == 0) continue;for(ll i = 0;i<26;i++){node* temp = k;bool bl = 1;while(temp!=NULL){ll b = 1;if(temp->nextt[i]!=NULL) b = temp->nextt[i]->num;if(b == 0){bl = 0;tmmmt.an[b][a]++;break;}temp = temp->fail;}if(!bl) continue;temp = k;while(temp!=NULL){if(temp->nextt[i]!=NULL){ll b = temp->nextt[i]->num;tmmmt.an[b][a]++;bl = 0;break;}temp = temp->fail;}if(bl) tmmmt.an[1][a]++;if(k->nextt[i]!=NULL) q.push(k->nextt[i]);}}
}int main()
{int i,j,k;while(cin>>N>>L){e = 1;memset(tmmmt.an,0,sizeof(tmmmt.an));root = new node();e++;for(i = 0;i<N;i++) scanf("%s",s),insert();
//        for(i = 0;i<N;i++)
//        {
//            if(visit[i]) continue;
//            for(j = 0;j<N;j++)
//            {
//                if(i == j) continue;
//                if(kmp(ts[i],ts[j]))
//                    visit[j] = 1;
//            }
//        }
//        for(i = 0;i<N;i++)
//        {
//            //if(visit[i]) continue;
//            ll l = strlen(ts[i]+1);
//            for(j = 0;j<=l;j++)
//                s[j] = ts[i][j+1];
//            insert();
//        }
        build();ask();tmmmt.an[0][0] = 26;
//        for(j = 0;j<e;j++)
//        {
//            ll sum = 0;
//            for(i = 0;i<e;i++)
//            {
//                sum+=tmmmt.an[i][j];
//            }
//            tmmmt.an[1][j] = 26-sum;
//        }tmmmt.an[e][0] = tmmmt.an[e][e] = 1;e++;
//        for(i = 1;i<e-1;i++)
//        {
//            for(j = 1;j<e-1;j++)
//            {
//                cout<<setw(3)<<tmmmt.an[i][j];
//            }
//            cout<<endl;
//        }tmmmt = mpow(tmmmt,L+1);
//        for(i = 0;i<e;i++)
//        {
//            for(j = 0;j<e;j++)
//            {
//                cout<<tmmmt.an[i][j]<<" ";
//            }
//            cout<<endl;
//        }printf("%I64u\n",tmmmt.an[e-1][1]);}return 0;
}

尼玛可算是过啦

转载于:https://www.cnblogs.com/wos1239/p/4410493.html

hdu2243考研路茫茫——单词情结相关推荐

  1. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...

  2. hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

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

  3. hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)

    题目链接:hdu_2243_考研路茫茫--单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...

  4. 【HDU No. 2243】单词情结 考研路茫茫——单词情结

    [HDU No. 2243]单词情结 考研路茫茫--单词情结 杭电OJ 题目地址 [题意] 单词和词根仅由小写字母组成.给定N个词根,求长度不超过L 且至少包含一个词根的单词可能有多少个? 若有两个词 ...

  5. 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)

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

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

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

  7. HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下 ...

  8. HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法

    http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给出m个串,问有多少不大于n的串至少包含m个串中的一个? 思路:首先求出不包含m个串的长度 ...

最新文章

  1. 用电脑发短信_重磅!一个软件实现电脑上接打手机电话、收发短信、传文件、屏幕镜像!...
  2. poj 3984
  3. 数据库死锁查询及处理
  4. 7.11牛客题(指针)
  5. GIPC2018全球知识产权生态大会
  6. 【CF】304 E. Soldier and Traveling
  7. lightbox的一个ajax效果
  8. Angular07 利用angular打造管理系统页面
  9. xp怎么删除计算机用户,WinXp系统如何删除用户账户?Xp系统删除用户账号的方法...
  10. opencv库函数学习:Rect函数
  11. 苹果蓝牙耳机平替哪个好用?商务通话蓝牙耳机推荐
  12. [BZOJ]4198 [NOI2015] 荷马史诗 哈夫曼树
  13. 做计算机用英语怎么读,计算机英语怎么读
  14. GRM Tools 声音设计套装 Delays 演示
  15. Sourcetree 分支合到主干
  16. 在浏览器中打开“只能用微信内置浏览器”打开的页面
  17. 魅族16php7.3系统,魅族16th官方稳定版固件rom系统刷机包:Flyme 7.3.0.0A
  18. 和平精英分数计算机制,和平精英加分机制怎么算 加分玩法详解
  19. ubuntu / linuxmint 搜狗输入法安装后 fcitx configure找不到的解决办法
  20. AE快速批量添加字幕

热门文章

  1. 《Python编程从入门到实践》记录之类的使用
  2. 3D Vision公开课精华 | 深度三维感知:数据、学习架构与应用
  3. 物体检测方法总结(下)
  4. html网页制作每周食谱,新增食谱.html
  5. Huawei LiteOS 开发指南
  6. 从零开始实现数据结构(二) 有序数组
  7. 「NOIP 2013」 货车运输
  8. 静态 动态 强类型 弱类型语言的区别
  9. 创建表空间、用户和赋权
  10. 在C/C++函数中使用可变参数