hdu2243考研路茫茫——单词情结
于是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实在是数不出来了,现在就请你帮帮他。
#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考研路茫茫——单词情结相关推荐
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫--单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- 【HDU No. 2243】单词情结 考研路茫茫——单词情结
[HDU No. 2243]单词情结 考研路茫茫--单词情结 杭电OJ 题目地址 [题意] 单词和词根仅由小写字母组成.给定N个词根,求长度不超过L 且至少包含一个词根的单词可能有多少个? 若有两个词 ...
- 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)
考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下 ...
- HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法
http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...
- HDU 2243 考研路茫茫——单词情结(自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给出m个串,问有多少不大于n的串至少包含m个串中的一个? 思路:首先求出不包含m个串的长度 ...
最新文章
- 用电脑发短信_重磅!一个软件实现电脑上接打手机电话、收发短信、传文件、屏幕镜像!...
- poj 3984
- 数据库死锁查询及处理
- 7.11牛客题(指针)
- GIPC2018全球知识产权生态大会
- 【CF】304 E. Soldier and Traveling
- lightbox的一个ajax效果
- Angular07 利用angular打造管理系统页面
- xp怎么删除计算机用户,WinXp系统如何删除用户账户?Xp系统删除用户账号的方法...
- opencv库函数学习:Rect函数
- 苹果蓝牙耳机平替哪个好用?商务通话蓝牙耳机推荐
- [BZOJ]4198 [NOI2015] 荷马史诗 哈夫曼树
- 做计算机用英语怎么读,计算机英语怎么读
- GRM Tools 声音设计套装 Delays 演示
- Sourcetree 分支合到主干
- 在浏览器中打开“只能用微信内置浏览器”打开的页面
- 魅族16php7.3系统,魅族16th官方稳定版固件rom系统刷机包:Flyme 7.3.0.0A
- 和平精英分数计算机制,和平精英加分机制怎么算 加分玩法详解
- ubuntu / linuxmint 搜狗输入法安装后 fcitx configure找不到的解决办法
- AE快速批量添加字幕