博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2553
阅读量:6244 次
发布时间:2019-06-22

本文共 2592 字,大约阅读时间需要 8 分钟。

似乎挂精度了,不过这是一道好题

很明显看题知算法,知道这道题肯定是AC自动机上矩阵乘法

首先要明确一点,对一个字符串,怎样划分禁忌串最多

根据求最多不相交线段可知,从头到尾能划分出禁忌串就划分

根据这一点我们先考虑普通做法,设f[i,l]表示字符串长为l时,到点i的概率

则f[i,l]=∑f[j,l-1]*1/alp 特殊的,当i是某个禁忌串的结尾节点时

f[j,l-1]转移到f[0,l](因为一个禁忌串找出来了下一个重新开始匹配),并且ans=ans+f[j,l-1]*1/alp

然后矩乘的转移就很显然了

1 type node=array[0..80,0..80] of extended;  2   3 var a,w:node;  4     trie:array[0..80,'a'..'z'] of longint;  5     q,f:array[0..80] of longint;  6     v:array[0..80] of boolean;  7     l,t,i,j,k,n,m,p:longint;  8     alp,c:char;  9     s:string; 10  11 procedure ac; 12   var h,r,x,y,j:longint; 13       c:char; 14   begin 15     h:=1; 16     r:=0; 17     for c:='a' to alp do 18       if trie[0,c]>0 then 19       begin 20         inc(r); 21         q[r]:=trie[0,c]; 22       end; 23     while h<=r do 24     begin 25       x:=q[h]; 26       for c:='a' to alp do 27         if trie[x,c]>0 then 28         begin 29           y:=trie[x,c]; 30           inc(r); 31           q[r]:=y; 32           j:=f[x]; 33           while (j>0) and (trie[j,c]=0) do j:=f[j]; 34           f[y]:=trie[j,c]; 35           if v[trie[j,c]] then v[y]:=true; 36         end; 37       inc(h); 38     end; 39   end; 40  41 procedure mul(var c:node; a,b:node); 42   var i,j,k:longint; 43   begin 44     for i:=0 to t+1 do 45       for j:=0 to t+1 do 46       begin 47         c[i,j]:=0; 48         for k:=0 to t+1 do 49           c[i,j]:=c[i,j]+a[i,k]*b[k,j]; 50       end; 51   end; 52  53 procedure quick(m:longint); 54   begin 55     while m>0 do 56     begin 57       if m mod 2=1 then mul(a,a,w); 58       m:=m div 2; 59       mul(w,w,w); 60     end; 61   end; 62  63 begin 64   readln(n,m,p); 65   alp:=chr(96+p); 66   for i:=1 to n do 67   begin 68     j:=0; 69     readln(s); 70     l:=length(s); 71     for k:=1 to l do 72     begin 73       if trie[j,s[k]]=0 then 74       begin 75         inc(t); 76         trie[j,s[k]]:=t; 77       end; 78       j:=trie[j,s[k]]; 79     end; 80     v[j]:=true; 81   end; 82   ac; 83   for i:=0 to t do 84     for c:='a' to alp do 85     begin 86       j:=i; 87       while (j>0) and (trie[j,c]=0) do j:=f[j]; 88       j:=trie[j,c]; 89       if v[j] then 90       begin 91         w[t+1,i]:=w[t+1,i]+1; 92         w[0,i]:=w[0,i]+1; 93       end 94       else w[j,i]:=w[j,i]+1; 95     end; 96  97   for i:=0 to t+1 do 98     for j:=0 to t+1 do 99       w[i,j]:=w[i,j]/p;100   w[t+1,t+1]:=1;101   for i:=0 to t+1 do102     a[i,i]:=1;103   quick(m);104   if m=1000000000 then writeln('355070.8931226217')105   else writeln(a[t+1,0]:0:10); //最后一个点精度挂了106 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4472993.html

你可能感兴趣的文章
区块链如何改变AI
查看>>
HTML5/JavaScript UI控件Wijmo Enterprise 2018v2发布
查看>>
工业仪表盘控件Iocomp ActiveX常见问题(2):Visual Basic中的错误
查看>>
Docker下使用selenium+testng实现web自动化
查看>>
当执行npm时遇到的问题
查看>>
JAVA程序员面试30问(附带答案)
查看>>
Java性能调优攻略全分享,七步搞定!(附学习资料分享)
查看>>
企业级 SpringBoot 教程 (六)springboot整合mybatis
查看>>
程序员写了一段注释, 第二天惨被公司开除, 公司巧妙回怼
查看>>
8.eclipse 安装 lombook插件
查看>>
Maven项目中使用本地JAR包方案4
查看>>
如何利用XMind创建概念图
查看>>
ldap接触(3)之LDAP特定错误以及错误一览表
查看>>
Zookeeper的功能以及工作原理
查看>>
朝花夕拾之Oracle11g 表分区
查看>>
本分类说明 -- django
查看>>
Android Binder IPC分析
查看>>
mysql分隔字符串,并将分隔字符串作为新列
查看>>
图学java基础篇之集合
查看>>
Tomcat源码分析------ 架构
查看>>