Description


Input

Output

Sample Input

5
he
she
her
hers
his
hershe
0.30 5

Sample Output

0.163 0.031 0.031 0.031 0.002

Hint

出现的次数分别为:
2 1 1 1 0
由概率的知识可以得到输出

       he    she   her   hers  his

一次之后 1.000 1.000 1.000 1.000 0.300
又一次之后 1.000 0.510 0.510 0.510 0.090
又一次之后 0.657 0.216 0.216 0.216 0.027
又一次之后 0.348 0.084 0.084 0.084 0.008
又一次之后 0.163 0.031 0.031 0.031 0.002

Solution

  • 这题较为复杂,可以转化为两个部分解决:字符串匹配求概率

  • ①:在解决字符串匹配的问题上,我的第一感觉就是 N 次 KMP,简单可行。

  • 可是 O(NL)O(NL) 的时间复杂度令人难以接受( 1≤L≤1061\leq L\leq10^6 , 1≤N≤2001\leq N\leq200 )

  • 于是我们就可以使用强大的 AC自动机 算法, O(L)O(L) ,用以解决这个多模匹配问题。

  • ②:在解决求概率的问题上,我们可以画一个情况二叉树,左右儿子分别代表是否遗忘。

  • 将①中求得的每个字符串出现的次数进行排序,设次数第 ii 少的“记住”概率为 FiF_i 。

  • 则通过情况二叉树可推得:

    Fi = Fi−1+Ci−1k∗(1−p)i−1∗pk−(i−1)

    F_i\ =\ F_{i-1}+C_k^{i-1}*(1-p)^{i-1}*p^{k-(i-1)}

  • (K层选(i-1)层来遗忘=>Ci−1kC_k^{i-1}、遗忘概率 (1−p)i−1(1-p)^{i-1} 、记住概率 pk−(i−1)p^{k-(i-1)} )

  • 上面的计算注意边乘边除、互相抵消,则不会爆掉。

  • ‘综上①②,就可以解出本题,总时间复杂度约为 O(L)O(L) ,乘上许常数。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=201,M=1e6+5;
int n,k,len;
double p;
int g[N],id[N],h[N],l[N],next[N];
double f[N];
char c[25],s[M];
inline bool cmp(int x,int y)
{return g[x]<g[y];
}
struct AC_Automation
{int siz;int trie[N*N][26],a[N*N],v[N*N],next[N*N],fail[N*N];void init(){siz=0;memset(v,0,sizeof(v));memset(fail,0,sizeof(fail));memset(trie[0],0,sizeof(trie[0]));}void insert(char *p,int num){int len=strlen(p),j=0;for(int i=0;i<len;i++){if(!trie[j][p[i]-'a']){trie[j][p[i]-'a']=++siz;memset(trie[siz],0,sizeof(trie[siz]));}j=trie[j][p[i]-'a'];}v[j]++;a[j]=num;}void getfail(){queue<int>que;for(int i=0;i<26;i++){int x=trie[0][i];if(x){fail[x]=next[x]=0;que.push(x);        }}while(!que.empty()){int now=que.front();que.pop();for(int i=0;i<26;i++){int x=trie[now][i],y=fail[now];if(!x){trie[now][i]=trie[y][i];continue;}que.push(x);while(y && !trie[y][i]) y=fail[y];fail[x]=trie[y][i];next[x]=v[fail[x]]?fail[x]:next[fail[x]];}}}void find(char *p){int len=strlen(p);getfail();for(int i=0,j=0;i<len;i++){j=trie[j][p[i]-'a'];int x=j;while(x){g[a[x]]++;x=fail[x];}}}
}AC;
int main()
{AC.init();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",&c);AC.insert(c,i);}scanf("%s",&s);AC.find(s);scanf("%lf%d",&p,&k);/*--------for(int i=1;i<=n;i++){scanf("%s",c[i]+1);l[i]=strlen(c[i]+1);}scanf("%s",s+1);len=strlen(s+1);scanf("%lf%d",&p,&k);for(int t=1;t<=n;t++){for(int i=2,j=0;i<=l[i];i++){while(j && c[t][i]!=c[t][j+1]) j=next[j];if(c[t][i]==c[t][j+1]) j++;next[i]=j;}for(int i=1,j=0;i<=len;i++){while(j && s[i]!=c[t][j+1]) j=next[j];if(s[i]==c[t][j+1]) j++;if(j==l[t]){g[t]++;j=next[j];continue;}}}--------KMP--------*/for(int i=1;i<=n;i++) id[i]=i;sort(id+1,id+1+n,cmp);int num=0;g[0]=-1;for(int i=1;i<=n;i++){       if(g[id[i]]!=g[id[i-1]]) num++;h[id[i]]=num;}for(int i=1;i<=num;i++){int q=i-1;double sum=1;for(int j=1;j<=q;j++) sum=sum*(1-p)/j*(k-j+1);for(int j=1;j<=k-q;j++) sum*=p;f[i]=f[q]+sum;}for(int i=1;i<=n;i++) printf("%.3lf ",f[h[i]]);return 0;
}

JZOJ 5167. 【NOIP2017模拟6.26】下蛋爷相关推荐

  1. jzoj5167. 下蛋爷(AC自动机)

    下蛋爷 Description Input Output Sample Input 5 he she her hers his hershe 0.30 5 Sample Output 0.163 0. ...

  2. jzoj3058. 【NOIP2012模拟10.26】火炬手

    jzoj3058. [NOIP2012模拟10.26]火炬手 题目 Description Input Output Sample Input Sample Output Hint 分析 做法一 做法 ...

  3. JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气

    Description Input Output Sample Input 3 2 1 8 4 5 7 9 3 1 5 2 Sample Output 6 5 Data Constraint Hint ...

  4. JZOJ 5389. 【NOIP2017提高A组模拟9.26】解梦

    Description DYY 很善于解梦,昨晚,他梦见自己来到了一个高度发达的国度. 众所周知,我们现在有极为常用的三级运算,+..^.其中,a*b=a+a+a+-+a(b 个a),a^b=a*a* ...

  5. JZOJ.5234【NOIP2017模拟8.7】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  6. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    Description Input 输入文件名为lipschitz.in. 第一行一个整数n. 接下来一行n个整数,描述序列A. 第三行一个数q . 接下来q行,每行三个整数.其中第一个整数type表 ...

  7. JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  8. JZOJ.5264【NOIP2017模拟8.12】化学

    Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint 搜索.考虑到m很大,我们不 ...

  9. JZOJ.5274【NOIP2017模拟8.14】数组

    Description Input Output Sample Input 输入样例1: 3 2 7 5 4 2输入样例2: 5 3 1 5 4 3 5 5 Sample Output 输出样例1: ...

最新文章

  1. [C#][EF] 添加表添加不进来
  2. Swift入门篇-循环语句
  3. 实时音频抗弱网技术揭秘
  4. xp和win7安装telnet服务
  5. Taro+react开发(13)--多加/不然不能跳转
  6. 接口测试学习之json
  7. 只用6张图教会AI识别物体,达摩院新方案大幅降低AI数据标注成本
  8. 基于情感词典、k-NN、Bayes、最大熵、SVM的情感分析比较及优缺点
  9. 读研计算机统计学怎样,【新加坡国立大学统计专业读研】 - 环外新加坡留学网...
  10. svn安装打开不弹出登录认证页面
  11. 如何在卸载Citrix Receiver之后清理删除残留文件 【Mac】
  12. 手机照片删除了还能找回来吗?高手就是高手,精彩
  13. 乔布斯一个人的世界(一)
  14. CIPP翻转内衬法整体修复技术简介
  15. 12、说说梯度下降法
  16. 开源许可协议 | GNU GPL
  17. 实现1V1音视频实时互动直播系统 十二、第九节 直播客户端的实现
  18. Bootstrap智能消息提示框
  19. STM32 PWM频率与占空比计算方式
  20. 用python构建机器学习模型分析空气质量

热门文章

  1. O(logn*2^logn)和O(n*logn)算法
  2. Golang 学习笔记资源
  3. C#字节数组与值类型变量的互相转换,以及注意事项
  4. Python源码剖析[16] —— Pyc文件解析
  5. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170316
  6. 云炬Android开发笔记 5-8文件下载功能设计与实现
  7. python 空值_数据库中的空值与NULL的区别以及python中的NaN和None
  8. 形变块匹配跟踪(2):配准跟踪与几何约束_md
  9. 算法导论-排序算法-分治法
  10. div的contentEnable属性