HDU2243_考研路茫茫――单词情结
给出一些词根,问你有多少种长度为L的串包含至少一个词根。
去年就在敲这个题了,今年才敲出来,还是内牛满面之中。。。
要求包含至少一个的情况,需要求出所有的情况,减去一个都没有的情况就可以了。
对于给出的词根,上自动机。然后我们根据tire图可以得出关系状态转移的矩阵。
显然就是矩阵求和了,通过二分幂解决即可。这些地方都有一些技巧可言的。
一开始没有考虑压缩fail指针,考虑了非法的情况,真是wa出翔了。
召唤代码君:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
typedef unsigned long long ll;
using namespace std; ll n,L;
ll next[][],fail[],tag[],N; struct Mat{
ll a[][];
Mat() { memset(a,,sizeof a); }
Mat operator + (Mat M) const {
Mat tmp;
for (ll i=; i<=n; i++)
for (ll j=; j<=n; j++) tmp.a[i][j]=a[i][j]+M.a[i][j];
return tmp;
}
Mat operator * (Mat M) const {
Mat tmp;
for (ll i=; i<=n; i++)
for (ll j=; j<=n; j++)
for (ll k=; k<=n; k++)
tmp.a[i][j]+=a[i][k]*M.a[k][j];
return tmp;
}
Mat power(ll x)
{
Mat tmp1,tmp2;
for (ll i=; i<=n; i++){
tmp1.a[i][i]=;
for (ll j=; j<=n; j++){
tmp2.a[i][j]=a[i][j];
}
}
while (x){
if (x&) tmp1=tmp1*tmp2;
x>>=,tmp2=tmp2*tmp2;
}
return tmp1;
}
void output(){
for (ll i=; i<=n; i++){
for (ll j=; j<=n; j++) cout<<a[i][j]<<' ';
cout<<endl;
}
}
}; ll add()
{
fail[++N]=,tag[N]=;
for (ll i=; i<; i++) next[N][i]=;
return N;
} void insert(char s[])
{
ll cur=,k;
for (ll i=; s[i]; i++){
k=s[i]-'a';
if (!next[cur][k]) next[cur][k]=add();
cur=next[cur][k];
}
tag[cur]=;
} void AC_build()
{
queue<int> Q;
Q.push();
while (!Q.empty()){
ll cur=Q.front(),child,k;
Q.pop();
for (ll i=; i<; i++){
child=next[cur][i];
if (child){
if (!cur) fail[child]=;
else{
for (k=fail[cur]; k && !next[k][i]; k=fail[k]) ;
fail[child]=next[k][i];
}
Q.push(child);
}
else next[cur][i]=next[fail[cur]][i];
}
}
} ll power(ll x,ll y)
{
ll tot=;
while (y){
if (y&) tot=tot*x;
y>>=,x=x*x;
}
return tot;
} int main()
{
char s[];
while (cin>>n>>L){
N=;
fail[]=tag[]=;
for (ll i=; i<; i++) next[][i]=;
for (ll i=; i<n; i++)
{
scanf("%s",s);
insert(s);
}
AC_build();
for (ll i=; i<=N; i++)
if (tag[fail[i]]) tag[i]=;
n=N;
Mat cur,E,ans;
for (ll i=; i<=n; i++)
for (ll j=; j<; j++){
if (!tag[i] && !tag[next[i][j]]) cur.a[i][next[i][j]]++;
} for (ll i=; i<=n; i++) E.a[i][i]=;
Mat tmp=E;
ll num=,here=;
while (L>){
if (L&) {
ans=ans+tmp*cur.power(L);
num+=here*power(,L);
}
L>>=;
here=here*power(,L)+here;
tmp=tmp*(cur.power(L)+E);
}
for(ll i=; i<=n; i++) num-=ans.a[][i];
cout<<num<<endl;
}
return ;
}
HDU2243_考研路茫茫――单词情结的更多相关文章
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU 2243 考研路茫茫——单词情结
考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...
- hud2243 考研路茫茫——单词情结
考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
随机推荐
- volley_之2
一开始会不会觉得有点怔,为什么只需要将请求添加到队列中,不需要去发送请求吗?当然是要的,只是这一切都被封装在Volley后面而已. 我们先来看一下隐藏在Volley后面的这个架构是怎么样的吧,如下图: ...
- ubuntu下安装php memcache扩展
memcached 安装sudo apt-get install memcached memcached 参数说明memcached -d -m 50 -p 11211 -u root-m 指定使用多 ...
- “NOT_IN”与“NULL”的邂逅
今天处理了一个因“NOT IN”与“NULL”邂逅导致的问题,值得思考和总结,记录在此,供参考.(感谢John抛出的问题) 我们以实验的形式先再现一下这个问题,然后对其分析,最后给出几种解决方案. 1 ...
- 预处理语句--#define、#error和#warning
1.#define语句 我们经常会这样定义一些宏: #define BLOCK 8192 但这样的宏却不能在字符串中展开,如: printf("The BLOCK numb ...
- .net一次连接执行多条sql语句
方法一: string SQLString="select 1; select 2;"; using (OdbcConnection connection = new OdbcCo ...
- Django views 中 View decorators
decorators(装饰器) 1. require_http_methods 在django.views.decorators.http中,可以用来限制请求的权限. require_http_met ...
- crosswalk-webview
https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview https://cordova.apache.org/doc ...
- iperf3实践
The basic commands are the same for iperf and iperf3: SAMPLE IPERF/IPERF3 COMMANDS Server: iperf/ipe ...
- 新建jsp报错“The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path”
今天新建jsp文件时,就报错“Visual Page Editor has experimental support for Windows 64-bit”,然后刚好stackoverflow上面有这 ...
- Unknow Unknow
Unknow Unknow,讲的大概意思是:你不知道这事情的时候,那么请不要轻易下任何结论.例如,这个太难了,放弃吧.嗯,这个是捷径.而最后却是,困难的路越走越容易,容易的路越走越难.只是一种常见的现 ...