给出一些词根,问你有多少种长度为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_考研路茫茫――单词情结的更多相关文章

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

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

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

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

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

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

  4. hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】

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

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

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

  6. HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化

    题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

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

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

  8. hud2243 考研路茫茫——单词情结

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

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

    题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...

随机推荐

  1. volley_之2

    一开始会不会觉得有点怔,为什么只需要将请求添加到队列中,不需要去发送请求吗?当然是要的,只是这一切都被封装在Volley后面而已. 我们先来看一下隐藏在Volley后面的这个架构是怎么样的吧,如下图: ...

  2. ubuntu下安装php memcache扩展

    memcached 安装sudo apt-get install memcached memcached 参数说明memcached -d -m 50 -p 11211 -u root-m 指定使用多 ...

  3. “NOT_IN”与“NULL”的邂逅

    今天处理了一个因“NOT IN”与“NULL”邂逅导致的问题,值得思考和总结,记录在此,供参考.(感谢John抛出的问题) 我们以实验的形式先再现一下这个问题,然后对其分析,最后给出几种解决方案. 1 ...

  4. 预处理语句--#define、#error和#warning

    1.#define语句 我们经常会这样定义一些宏:       #define BLOCK 8192 但这样的宏却不能在字符串中展开,如:    printf("The BLOCK numb ...

  5. .net一次连接执行多条sql语句

    方法一: string SQLString="select 1; select 2;"; using (OdbcConnection connection = new OdbcCo ...

  6. Django views 中 View decorators

    decorators(装饰器) 1. require_http_methods 在django.views.decorators.http中,可以用来限制请求的权限. require_http_met ...

  7. crosswalk-webview

    https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview https://cordova.apache.org/doc ...

  8. iperf3实践

    The basic commands are the same for iperf and iperf3: SAMPLE IPERF/IPERF3 COMMANDS Server: iperf/ipe ...

  9. 新建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上面有这 ...

  10. Unknow Unknow

    Unknow Unknow,讲的大概意思是:你不知道这事情的时候,那么请不要轻易下任何结论.例如,这个太难了,放弃吧.嗯,这个是捷径.而最后却是,困难的路越走越容易,容易的路越走越难.只是一种常见的现 ...