初始有一个空串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. C#将图片白色背景设置为透明

    Image image = System.Drawing.Image.FromFile(@"C:\A.JPG"); Bitmap pbitmap = new Bitmap(imag ...

  2. asp.net IRequiresSessionState

    在一般处理程序中,使用context.Session对象,必须先继承IRequiresSessionState接口. System.Web.SessionState.IRequiresSessionS ...

  3. Struts2笔记03——架构(转)

    原始内容:https://www.tutorialspoint.com/struts_2/basic_mvc_architecture.htm 架构(很重要!尤其是图!) 从一个比较高的层次来看,St ...

  4. curl扩展代码

    /** * * curl 支持post * @param string $base_url 基础链接 * @param array $query_data 需要请求的数据 * @param strin ...

  5. 1.python基本数据类型

    1.数值类型(4种) 数值类型都是不可变的 1)整型(int) example: a = 0 b = -1 诸如此类,都为整型 2)浮点型(float) example: f = 1.1 f = -1 ...

  6. Android电容屏(一)【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7820492 关键词:Android  电容屏 tp  ITO 平台信息:内核:linu ...

  7. spring boot 使用thymeleaf3.0以及thymeleaf的热部署

    spring boot 截止1.5.4,默认使用thymeleaf2.0,会有一些很蛋疼的地方比如xml格式之类的,具体哪些就不说了 -> 替换为3.0版本 pom中加入 <propert ...

  8. webpack 从0 手动配置

    1. npm init 2. npm install -D webpack webpack-cli 3. 创建webpack入口文件( 默认 webpack.config.js 可以通过 webpac ...

  9. 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误

    标题: 连接到服务器 ------------------------------ 无法连接到 (local). ------------------------------ 其他信息: 在与 SQL ...

  10. HBase学习2(HBase shell)

    HBase 常用命令 查看当前用户:whoami 创建表:create '表名', '列族名1','列族名2','列族名N' 查看所有表:list 描述表: describe '表名' 判断表存在: ...