初始有一个空串s,从前n个大写字母中不断随机取出一个字母添加到s的结尾,出现模式串t时停止,求停止时s的长度期望。

这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一个结点,dp[u]为从该结点出发走到终结状态时的期望步数,则dp[u]=∑(1+dp[v])/n,v为u的后继状态。特别地,终结状态的dp值为0。

这样一来,就可以列出线性方程组进行高斯消元了。由于答案非常大,用double会损失精度,所以改成longlong。

由于有除法的存在,为了防止出现除不开的现象,我写了个大模数+逆元的版本,还需要用到按位乘。(闲的蛋疼系列)

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; const ll mod=(1ll<<)-;
int m,ka;
char s[];
ll Mul(ll x,ll p) {
if(p<)p+=mod;
ll ret=;
for(; p; x=(x+x)%mod,p>>=)if(p&)ret=(ret+x)%mod;
return ret;
}
ll Pow(ll x,ll p) {
ll ret=;
for(; p; x=Mul(x,x)%mod,p>>=)if(p&)ret=Mul(ret,x)%mod;
return ret;
}
ll inv(ll x) {return Pow(x,mod-);} struct Mat {
static const int N=;
int n;
ll a[N][N];
ll* operator[](int x) {return a[x];}
void gauss() {
for(int i=; i<n; ++i) {
int r=i;
if(!a[r][i]) {
for(int k=i+; k<n; ++k)if(a[k][i]) {r=k; break;}
}
if(r!=i)for(int j=i; j<=n; ++j)swap(a[i][j],a[r][j]);
for(int k=i+; k<n; ++k) {
ll tmp=Mul(a[k][i],inv(a[i][i]));
for(int j=i; j<=n; ++j)a[k][j]=(a[k][j]-Mul(a[i][j],tmp))%mod;
}
}
for(int i=n-; i>=; --i) {
for(int j=i+; j<n; ++j)a[i][n]=(a[i][n]-Mul(a[j][n],a[i][j]))%mod;
a[i][n]=Mul(a[i][n],inv(a[i][i]));
}
}
} G; struct AC {
static const int N=+,M=;
int go[N][M],pre[N],tot,end[N];
int idx(char ch) {return ch-'A';}
void init() {tot=; newnode();}
int newnode() {
int u=tot++;
memset(go[u],,sizeof go[u]);
end[u]=pre[u]=;
return u;
}
void ins(char* s) {
int u=,n=strlen(s);
for(int i=; i<n; u=go[u][idx(s[i])],++i)
if(!go[u][idx(s[i])])go[u][idx(s[i])]=newnode();
end[u]=;
}
void build() {
queue<int> q;
for(int i=; i<M; ++i)if(go[][i])q.push(go[][i]);
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=; i<M; ++i) {
if(go[u][i]) {
pre[go[u][i]]=go[pre[u]][i];
q.push(go[u][i]);
} else go[u][i]=go[pre[u]][i];
}
}
}
void gettransmat(Mat& G) {
G.n=tot;
int n=tot;
for(int i=; i<n; ++i)
for(int j=; j<=n; ++j)
G[i][j]=j==i?:;
for(int i=; i<tot; ++i)if(!end[i]) {
for(int j=; j<m; ++j)G[i][go[i][j]]=(G[i][go[i][j]]-inv(m))%mod;
G[i][n]=(G[i][n]+)%mod;
}
}
} ac; int main() {
int T;
scanf("%d",&T);
while(T--) {
if(ka)puts("");
printf("Case %d:\n",++ka);
ac.init();
scanf("%d%s",&m,s);
ac.ins(s);
ac.build();
ac.gettransmat(G);
G.gauss();
printf("%lld\n",(G[][G.n]+mod)%mod);
}
return ;
}

UVALive - 3490 Generator (AC自动机+高斯消元dp)的更多相关文章

  1. hdu 5955 Guessing the Dice Roll 【AC自动机+高斯消元】

    hdu 5955 Guessing the Dice Roll [AC自动机+高斯消元] 题意:给出 n≤10 个长为 L≤10 的串,每次丢一个骰子,先出现的串赢,问获胜概率. 题解:裸的AC自动机 ...

  2. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

  3. UVALive 7455 Linear Ecosystem (高斯消元)

    Linear Ecosystem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/B Description http://7xj ...

  4. bzoj 3143 [Hnoi2013]游走【高斯消元+dp】

    参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...

  5. bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】

    首先,我们发现,因为是无向图,所以相连的点之间是有"依赖性"的,所以不能直接用dp求解. 因为是xor,所以按位处理,于是列线性方程组,设$ x[i] $为点i到n异或和为1的期望 ...

  6. BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)

    BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...

  7. 【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机)

    [BZOJ1444][JSOI2009]有趣的游戏(高斯消元,AC自动机) 题面 BZOJ 题解 先把\(AC\)自动机构建出来,最好构成\(Trie\)图.然后这样子显然是在一个有向图中有一堆概率的 ...

  8. hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】

    含高斯消元模板 2016沈阳区域赛http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Limit: 2 ...

  9. 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...

随机推荐

  1. 中间件 WSGI

    冒泡程序 array = [1, 2, 5, 3, 6, 8, 4] for i in range(len(array) - 1, 0, -1): print i for j in range(0, ...

  2. UI控件之UICollectionView

    UICollectionView:集合视图,是iOS6.0后出现的,与UITableView类似,优势在于可以灵活的布局cell UICollectionViewLayout:布局类,抽象类,一般定义 ...

  3. g高分屏DataGrid里面checkbox不显示的解决办法

  4. post请求和get请求content_type的种类

    get请求的headers中没有content-type这个字段,post 的 content-type 有两种 : application/x-www-form-urlencoded 这种就是一般的 ...

  5. Scrapy安装方法

    Scrapy安装在Python2.7环境下 1.配置环境变量: 2.安装基础软件 4个(64位系统) 安装twisted: C:\Users\Administrator>pip  install ...

  6. Android系统开发--灯光系统之电池灯的流程分析

    Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...

  7. matlab第一个小应用

    今天安装了matlab,以前还是上线性代数的时候,老师让用过,以及水了一次数模的时候玩了一下.以前太年轻,总觉得这个用处不大虽然别人一直强调这个神器... 到了自己要用的时候才会意识到.大家可能也都听 ...

  8. 常用 GDB 命令中文速览

    转自:https://linux.cn/article-8900-1.html?utm_source=index&utm_medium=moremore 目录 break -- 在指定的行或函 ...

  9. JavaWeb基础

    1.Servlet: Servlet是JavaWeb的3大组件之一,是把url请求转为后台处理的具体类,此类必须实现Servlet接口,一把实际使用时无须我们实现,我们直接使用JavaEE的HTTPS ...

  10. JavaWeb -- 内省—beanutils工具包 的使用

    Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. Beanu ...