和上一题有点相似,但是这题是求包含的,并且还要求和

可以求所有情况-不包含的情况,所有情况可用矩阵快速幂求得

还有一点就是如果题目说答案余2^64,直接开unsigned long long就行了,会自动取膜的

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
#define mod (1ll<<64ll)
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; struct Node{
int row,col;
ull a[N][N];
};
Node mul(Node x,Node y)
{
Node ans;
ans.row=x.row;ans.col=y.col;
memset(ans.a,,sizeof ans.a);
for(int i=;i<x.row;i++)
for(int j=;j<x.col;j++)
for(int k=;k<y.col;k++)
ans.a[i][k]=(ans.a[i][k]+x.a[i][j]*y.a[j][k]);
return ans;
}
Node quick_mul(Node x,ll n)
{
Node ans;
ans.row=x.row;ans.col=x.col;
memset(ans.a,,sizeof ans.a);
for(int i=;i<ans.row;i++)ans.a[i][i]=;
while(n)
{
if(n&)ans=mul(ans,x);
x=mul(x,x);
n/=;
}
return ans;
}
struct Trie{
int tot,root;
int Next[N][],fail[N];
bool End[N];
int newnode()
{
for(int i=;i<;i++)
Next[tot][i]=-;
End[tot]=;
return tot++;
}
void init()
{
tot=;
root=newnode();
}
void insertstring(string s)
{
int now=root;
for(int i=;i<s.size();i++)
{
if(Next[now][s[i]-'a']==-)
Next[now][s[i]-'a']=newnode();
now=Next[now][s[i]-'a'];
}
End[now]=;
}
void build()
{
queue<int>q;
int now=root;
for(int i=;i<;i++)
{
if(Next[root][i]==-)Next[root][i]=root;
else
{
fail[Next[root][i]]=root;
q.push(Next[root][i]);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
if(End[fail[now]])End[now]=;
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];
q.push(Next[now][i]);
}
}
}
}
Node getmartix()
{
Node ans;
ans.row=tot+;ans.col=tot+;
memset(ans.a,,sizeof ans.a);
for(int i=;i<tot;i++)
for(int j=;j<;j++)
if(!End[Next[i][j]])
ans.a[i][Next[i][j]]++;
for(int i=;i<tot+;i++)
ans.a[i][tot]=;
return ans;
}
void debug()
{
for(int i = ;i < tot;i++)
{
printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],End[i]);
for(int j = ;j < ;j++)
printf("%2d",Next[i][j]);
printf("]\n");
}
}
};
Trie ac;
string s;
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int m;
ll n;
while(cin>>m>>n)
{
ac.init();
for(int i=;i<m;i++)
{
cin>>s;
ac.insertstring(s);
}
ac.build();
// ac.debug();
Node ans=ac.getmartix();
ans=quick_mul(ans,n);
/* for(int i=0;i<ans.row;i++)
{
for(int j=0;j<ans.col;j++)
cout<<ans.a[i][j]<<" ";
cout<<endl;
}*/
ull p=;
for(int i=;i<ans.row;i++)
p+=ans.a[][i];
p--;
ans.row=;ans.col=;
ans.a[][]=;ans.a[][]=;
ans.a[][]=ans.a[][]=;
ans = quick_mul(ans,n);
ull res=ans.a[][]+ans.a[][];
res--;
//cout<<res<<" "<<p<<endl;
cout<<res-p<<endl;
}
return ;
}
/********************
2 3
aa ab
53324 18174
35150
1 2
a
702 650
52
********************/

最新文章

  1. R内存管理与垃圾清理
  2. 用C#开发ActiveX控件,并使用web调用
  3. SQL性能学习汇总 00
  4. FlashBuilder 4.7 win64 和 mac版 下载地址
  5. Facebook登录 AndroidStudio
  6. L9-3.安装PHP软件包
  7. ios framework 开发 之 实战二 ,成功
  8. Consul集群搭建 2Server+ 3Client
  9. python基础-----变量和简单数据类型
  10. Windwos Live Writer插件指南
  11. Spring AOP的实现及源码解析
  12. synchronized和volatile
  13. Mybatis中的缓存
  14. windows环境下lib和dll的区别和联系详细
  15. Codeforces Round #358 (Div. 2) B. Alyona and Mex 水题
  16. C++中二维数组的动态分配
  17. vue学习01
  18. How to deal with the problem &#39;&lt;&#39; in OpenERP&#39;s view file
  19. Android解析ClassLoader(一)Java中的ClassLoader
  20. opencv python3.6安装和测试

热门文章

  1. python中os模块函数方法详解最全最新
  2. [Idea]安装avtiviti插件以及 插件中文乱码
  3. 【Nginx】HTTP请求的11个处理阶段
  4. 解决网络 下载 句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
  5. LeetCode-day01&amp;02
  6. Linux常用的指令(...编辑文件+保存)
  7. Oracle索引表
  8. Python学习进程(3)Python基本数据类型
  9. 每天一个Linux命令(48)ping命令
  10. springboot-controller的使用