考研路茫茫——单词情结

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4179    Accepted Submission(s): 1225

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
 
Recommend
lcy
/**
题意:给出n个字符串,问长度为1~m的字符串中有多少是包含这n个字符串的
做法:AC自动机 + 矩阵快速幂 长度为1~m的字符串中有 pow(26.0,1) + ..... + pow(26.0,m)种
然后不包含病毒的有quick_pow(Maxtrix a,m);
所以包含病毒的有 pow(26.0,1) + ..... + pow(26.0,m) - quick_pow(Maxtrix a,m)种
**/
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <map>
#define MM 10
using namespace std;
struct Matrix
{
unsigned long long mat[][];
int n;
Matrix() {}
Matrix(int _n)
{
n = _n;
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
mat[i][j] = ;
}
}
}
Matrix operator *(const Matrix &b) const
{
Matrix res = Matrix(n);
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
res.mat[i][j] = ;
for(int k=; k<n; k++)
{
res.mat[i][j] += mat[i][k] * b.mat[k][j];
}
}
}
return res;
}
};
unsigned long long quick_pow(unsigned long long a,int n)
{
unsigned long long res = ;
unsigned long long tmp = a;
while(n)
{
if(n&) res *= tmp;
tmp *= tmp;
n >>= ;
}
return res;
}
Matrix quick_pow(Matrix a,int n)
{
Matrix res = Matrix(a.n);
for(int i=; i<a.n; i++)
{
res.mat[i][i] = ;
}
Matrix tmp = a;
while(n)
{
if(n&) res =res * tmp;
tmp = tmp * tmp;
n >>= ;
}
return res;
}
struct Tire
{
int next[][],fail[];
bool end[];
int L,root;
int newnode()
{
for(int i=; i<; i++)
{
next[L][i] = -;
}
end[L++] = ;
return L-;
}
void init()
{
L = ;
root = newnode();
}
void insert(char buf[])
{
int now = root;
int len = strlen(buf);
for(int i=; i<len; i++)
{
if(next[now][buf[i]-'a'] == -)
next[now][buf[i]-'a'] = newnode();
now = next[now][buf[i]-'a'] ;
}
end[now] = true;
}
void build()
{
queue<int>que;
int now = root;
fail[root] = root;
for(int i=; i<; i++)
{
if(next[now][i] == -)
next[now][i] = root;
else
{
fail[next[now][i]] = root;
que.push(next[now][i]);
}
}
while(!que.empty())
{
now = que.front();
que.pop();
if(end[fail[now]]) end[now] = true;
for(int i=; i<; i++)
{
if(next[now][i] == -)
next[now][i] = next[fail[now]][i];
else
{
fail[next[now][i]] = next[fail[now]][i];
que.push(next[now][i]);
}
}
}
}
Matrix getMatrix()
{
Matrix res = Matrix(L+);
for(int i=; i<L; i++)
{
for(int j=; j<; j++)
{
if(end[next[i][j]] == false && !end[i])
res.mat[i][next[i][j]] ++;
}
}
for(int i = ; i < L+; i++)
res.mat[i][L] = ;
return res;
}
};
char buf[];
Tire ac;
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(~scanf("%d %d",&n,&m))
{
ac.init();
for(int i=; i<n; i++)
{
scanf("%s",buf);
ac.insert(buf);
}
ac.build();
Matrix a = ac.getMatrix();
a = quick_pow(a,m);
unsigned long long res = ;
for(int i=; i<a.n; i++)
{
res += a.mat[][i];
}
res--;
unsigned long long sum = ;
Matrix c = Matrix();
c.mat[][] = ;
c.mat[][] = c.mat[][]= ;
c = quick_pow(c,m);
sum = c.mat[][] + c.mat[][];
sum --;
cout<<sum-res<<endl;
}
return ;
}

HDU-2243的更多相关文章

  1. hdu 2243 考研绝望——复杂的文字(AC自己主动机+矩阵高速功率)

    pid=2243" target="_blank" style="">题目链接:hdu 2243 考研路茫茫--单词情结 题目大意:略. 解题思 ...

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

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

  3. POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

    这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...

  4. hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意: 给出m个模式串,求长度不超过n的且至少包含一个模式串的字符串个数. 思路: 如果做过poj2778 ...

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

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

  7. HDU 2243 考研路茫茫——单词情结

    考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...

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

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

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

    题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...

  10. 考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)

    分析:与poj的2778差不多的,求出来所有的情况然后减去不包含的就行了,这次使用了一下kuangbin的那种自动机写法,确实还不错,因为尤是在建立矩阵的时候更加方便.   代码如下: ======= ...

随机推荐

  1. bzoj1263: [SCOI2006]整数划分(高精度+构造)

    第一次写压位高精度只好抄黄学长的 代码最后一段想了好久一看评论区才知道黄学长写错了= =很气 自己最后改对了T^T 这题最优是一直划分3出来直到<=4 #include<iostream& ...

  2. JavaScript中字符串与16进制之间的转换

    一.字符串转换为16进制 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  3. 【题解】Casting Spells LA 4975 UVa 1470 双倍回文 SDOI 2011 BZOJ 2342 Manacher

    首先要吐槽LRJ,书上给的算法标签是“有难度,需要结合其他数据结构”,学完Manacher才发现几乎一裸题 题目的意思是问原串中有多少个wwRwwR这样的子串,其中wR表示w的反串 比较容易看出来,w ...

  4. Qt error ------ 出现Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly

    出现原因: 使用了不存在的对象 数组越界了 用 delete 释放未分配的内存空间,或者超过一次释放同个内存 比如: 顺序不能颠倒 正确: ui->setupUi(this); ui->t ...

  5. 在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype

    FreeRTOS官方例程中设置了需要“Require prototype”,所以每个函数(除了main函数)都需要函数声明,其中对于无形参的函数声明要加void,比如void led_init(voi ...

  6. 优化Hadoop Balancer运行速度

    (如果运行hbase的话建议为16384),指定用于在DataNode间传输block数据的最大线程数,老版本的对应参数为dfs.datanode.max.xcievers 2.修改dfs.datan ...

  7. js获取当前页面的参数,带完善~~~

    let url = window.location.href; let id = url.slice(url.indexOf('?') + 4);

  8. c# 事实证明,abstract类除了不能用new实例化和类没什么区别

    abstract类是抽象类,不能够实例化,大家都知道,abstract类往往和接口interface一块儿使用,针对接口中一些公共的方法进行实现,然后实体类去继承抽象类和接口.虽然abstract类不 ...

  9. 【CODEVS】1281 Xn数列

    [算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1    c        0    c   0 防止溢出可以用类似快速幂的快速乘. ...

  10. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...