【bzoj1444】有趣的游戏 AC自动机+矩阵乘法

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1444

【题解】

AC自动机+矩阵乘法

首先把模式串建成AC自动机,构建出转移矩阵。

构造方法:a[i][j]表示从第i个结点转移到第j个结点的概率,则如果j被标记过,f[i][j]=1,否则f[i][j]=possble[ch[j]]

具体见代码:

#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXN 510
struct node{double p[MAXN][MAXN]; node(){memset(p,0,sizeof(p));}}a;
int n,l,m,cnt,id,fail[MAXN],end[MAXN],pos[MAXN],q[MAXN],tr[MAXN][27];
double chty[MAXN];
char ch[MAXN];
inline int read()
{
    int x=0,f=1;  char ch=getchar();
    while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
    while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
    return x*f;
}
void insert()
{
    int now=0;
    for(int i=1;i<=l;i++) 
    {
        if(!tr[now][ch[i]-'A'])  tr[now][ch[i]-'A']=++cnt;
        now=tr[now][ch[i]-'A'];
    }
    end[now]=1;  pos[++id]=now;
}
void build()
{
    int head=0,tail=0;
    for(int i=0;i


 
 
 
 

你可能感兴趣的:(bzoj,AC自动机,矩阵乘法)