Description

 Solution

T1 game

咕咕咕

T2 string

  1. fail树各个节点的深度之和怎么求?

    我们考虑每个前缀的深度是什么

    发现这个值就相当于有多少个前缀等于它的后缀

  2. 所以有个思路就是考虑一对相同子串的贡献

    假设这两个子串是\(S[x..y]\)和\(S[l..r]\)

    那么包含\(S[x..r]\)的fail树有\(n-r+1\)个,所以贡献就是\(n-r+1\)

  3. 发现上面的可以转化为求\(\sum f_i\),其中\(f_i\)表示\(S[1..i]\)包含的相等子串的数量

  4. 最后,考虑\(f_i\)比\(f_{i-1}\)多了多少,发现其实就是所有以\(S_i\)结尾的后缀的贡献总和

    考虑计算这个贡献总和

    这些串对应的节点实际上组成了parent树上从np到root的一条路径

    求路径和的话,可以用有根树LCT(不用makeroot)

    每个节点的贡献?

    \[(step[x]-step[fail[x]])*(cnt[x]-1)
    \]

    \(cnt[x]\)表示的是这个节点的\(right\)集合大小

  5. LCT需要做什么?

    支持单点修改\(step[x]-step[fail[x]]\)的值,以及维护子树和

    支持修改整条链(都是一条到根的路径)的\(cnt\)值

    支持求一条到根路径的贡献和

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. inline int read()
  4. {
  5. int x=0,f=1;char ch=getchar();
  6. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  8. return x*f;
  9. }
  10. #define get(x) (c[fa[x]][1]==x)
  11. const int MN=2e5+5,MX=4e5+5,mod=1e9+7;
  12. int fail[MX],ss[MX][26],step[MX];
  13. int last=1,cnt=1;
  14. ll ans=0,tmp=0;
  15. int val[MX],lazy[MX];
  16. ll X[MX],siz[MX];
  17. int fa[MX],c[MX][2];
  18. inline void upd(int x,int v)
  19. {
  20. if(!x)return;val[x]+=v;lazy[x]+=v;
  21. X[x]=(X[x]+1ll*siz[x]*v%mod)%mod;
  22. }
  23. inline void up(int x)
  24. {
  25. siz[x]=(siz[c[x][0]]+siz[c[x][1]]+step[x]-step[fail[x]])%mod;
  26. X[x]=(X[c[x][0]]+X[c[x][1]]+1ll*(val[x]-1)*(step[x]-step[fail[x]])%mod)%mod;
  27. }
  28. inline void down(int x){if(!lazy[x])return;upd(c[x][0],lazy[x]);upd(c[x][1],lazy[x]);lazy[x]=0;}
  29. inline bool nrt(int x){return c[fa[x]][1]==x||c[fa[x]][0]==x;}
  30. inline void rotate(int x)
  31. {
  32. int y=fa[x],z=fa[y],l=get(x),r=l^1;if(nrt(y))c[z][get(y)]=x;fa[x]=z;
  33. fa[c[x][r]]=y;c[y][l]=c[x][r];fa[y]=x;c[x][r]=y;up(y);
  34. }
  35. inline void Splay(int x)
  36. {
  37. static int q[MX],top;q[top=1]=x;register int i;
  38. for(i=x;nrt(i);i=fa[i]) q[++top]=fa[i];
  39. for(;top;--top) down(q[top]);
  40. for(;nrt(x);rotate(x)) if(nrt(fa[x])) rotate(get(x)^get(fa[x])?x:fa[x]);
  41. up(x);
  42. }
  43. inline void access(int x){register int i;for(i=0;x;x=fa[i=x])Splay(x),c[x][1]=i,up(x);}
  44. inline void cut(int x){access(x);Splay(x);upd(c[x][0],-val[x]);fa[c[x][0]]=0;c[x][0]=0;up(x);}
  45. inline void link(int x,int y){fa[x]=y;access(y);Splay(y);upd(y,val[x]);}
  46. inline void add(int x,int y){access(x);Splay(x);siz[x]=(siz[x]+y)%mod;X[x]=(X[x]+1ll*(val[x]-1)*y%mod)%mod;}
  47. inline int query(int x){access(x);Splay(x);return X[x];}
  48. inline void Insert(int x)
  49. {
  50. int p=last,np=++cnt;step[np]=step[p]+1;val[np]=1;
  51. for(;p&&!ss[p][x];p=fail[p]) ss[p][x]=np;
  52. if(!p)link(np,1),fail[np]=1,add(np,step[np]);
  53. else
  54. {
  55. int q=ss[p][x];
  56. if(step[q]==step[p]+1)link(np,q),fail[np]=q,add(np,step[np]-step[q]);
  57. else
  58. {
  59. int nq=++cnt;step[nq]=step[p]+1;
  60. memcpy(ss[nq],ss[q],sizeof ss[nq]);
  61. add(nq,step[nq]-step[fail[q]]);
  62. add(q,step[fail[q]]-step[nq]);
  63. add(np,step[np]-step[nq]);
  64. link(nq,fail[q]);cut(q);link(q,nq);link(np,nq);
  65. fail[nq]=fail[q];fail[q]=fail[np]=nq;
  66. for(;ss[p][x]==q;p=fail[p]) ss[p][x]=nq;
  67. }
  68. }
  69. last=np;
  70. tmp=(tmp+query(last))%mod;
  71. ans=(ans+tmp)%mod;
  72. printf("%lld\n",ans);
  73. }
  74. char s[MN];
  75. int main()
  76. {
  77. int i,Len=read();
  78. scanf("%s",s+1);
  79. for(i=1;i<=Len;++i) Insert(s[i]-'a');
  80. }

T3 hunter

概率dp

\(f_{i,j}\)表示得是当前被射中的是第\(i\)号猎人,当前还有\(j\)个人时,的答案。

当然我们所说的\(i\)号是对当前剩余猎人进行排序后,从\(1\)号猎人开始数的第\(i\)个,所以\(i\leq j\)

有一个约定是当前剩下的人中一定有\(1\),不然答案就是\(0\)了,我们根本不需要计算

于是:

\[f_{i,j}=\frac{1}{2}(f_{Nex(i),j,},f_{nex(i),j-1})
\]

自行意会,这里的\(Nex(i)\)和\(nex(i)\)不是同一个,因为当人数减少后,对应编号会变。

我们设\(t_{i,j}=f_{nex(i),j-1}\),注意\(t_{1,j}=0\),要特别计算

但是,计算\(f_{i,j}\),要求的值形成了若干个环

小学数学告诉我们:

  1. 环的数量是\(gcd(j,k)\)
  2. 环的长度是\(\frac{j}{gcd(j,k)}\)

我们对每个环进行计算,设这个环上的元素一次是\(a_{p_1},a_{p_2},...,a_{p_n}\)

于是就有

\[a_{p_i}=\frac{1}{2}(t_{P_i}+a_{p_i})
\]

暴力解方程可以得知:

\[a_1=\frac{2^{n-1}t_1+2^{n-2}t_2+...+t_n}{2^n-1}
\]

其他的就是轮换一下,就不说啦

然后,就没有然后了

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define max(a,b) ((a)>(b)?(a):(b))
  4. #define min(a,b) ((a)<(b)?(a):(b))
  5. inline int read()
  6. {
  7. int x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  10. return x*f;
  11. }
  12. const int mod=1e9+7,MN=2005;
  13. int n,k;
  14. int fpow(int x,int m){int r=1;for(;m;m>>=1,x=1ll*x*x%mod)if(m&1)r=1ll*r*x%mod;return r;}
  15. int gcd(int x,int y){return x?gcd(y%x,x):y;}
  16. int f[MN][MN],t[MN],p2[MN];
  17. signed main()
  18. {
  19. register int i,j,h,ln;
  20. n=read();k=read();
  21. f[1][1]=1;
  22. for(p2[0]=i=1;i<=n+1;++i) p2[i]=p2[i-1]*2ll%mod;
  23. for(i=2;i<=n;++i)
  24. {
  25. #define nx(x) ((x+k%i-1)%i+1)
  26. for(j=1;j<=i;++j)
  27. {
  28. int nex=((k-1)%(i-1)+1+j-1-1)%(i-1)+1;
  29. t[j]=f[nex][i-1];
  30. }
  31. t[1]=0;
  32. int num=gcd(i,k%i),len=i/num,val,Inv=fpow(p2[len]-1,mod-2);
  33. for(j=1;j<=num;++j)
  34. {
  35. val=0;
  36. for(ln=len,h=j;ln;--ln,h=nx(h)) (val+=1ll*p2[ln-1]*t[h]%mod)%=mod;
  37. f[j][i]=1ll*val*Inv%mod;
  38. for(ln=len,h=j;ln>1;--ln,h=nx(h))
  39. {
  40. (val+=mod-1ll*p2[len-1]*t[h]%mod)%=mod,val=2ll*val%mod,(val+=t[h])%=mod;
  41. f[nx(h)][i]=1ll*val*Inv%mod;
  42. }
  43. }
  44. }
  45. printf("%d\n",f[(k-1)%n+1][n]);
  46. return 0;
  47. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FCS省选模拟赛 Day3的更多相关文章

  1. FCS省选模拟赛 Day1

    Description  Solution T1 shopping 目测是插板法乱搞一下 发现题解写的是容斥dp: \[ ans = \sum_i (-1)^ig[i] \] \(g[i]\)表示的有 ...

  2. FCS省选模拟赛 Day7

    Description  Solution T1 island 考虑把问题成两部分计算 纵坐标的距离和很好计算,在输入的同时一次计算了就完事 横坐标又分成两部分 分别在\(y\)轴不同侧的矩形的距离和 ...

  3. FCS省选模拟赛 Day4

    传送门 Solution Code  /* 斯坦纳树:O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度 15:15~16:20 原题:bzoj_4774 */ #include ...

  4. FCS省选模拟赛 Day5

    传送门 Solution Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?( ...

  5. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  6. 【2018.10.20】noip模拟赛Day3 飞行时间

    今天模拟赛题目 纯考输入的傻逼题,用$scanf$用到思想僵化的我最终成功被$if$大法爆$0$了(这题只有一组$100$分数据). 输入后面那个$(+1/2)$很难$if$判断,所以我们要判两个字符 ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  9. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

随机推荐

  1. aspnetcore 容器化部属到阿里云全过程记录

    第一次写博客,作为一个全栈er,记录一下从阿里云到产品运维上线的全过程 一.阿里云上的设置 购买阿里云ECS后: 进控制台查看实例公网IP 在控制台.网络与安全->安全组,配置规则 点击进去可以 ...

  2. undefined reference to cv::imread(cv::String const&, int)

    .build_release/lib/libcaffe-nv.so: undefined reference to cv::imread(cv::String const&, int)' .b ...

  3. linux 下 shell脚本报错:-bash: ./build.sh: /bin/sh^M: bad interpreter: No such file or directory

    主要原因是build.sh是在windows下编辑然后上传到linux系统里执行的..sh文件的格式为dos格式.而linux只能执行格式为unix格式的脚本. 我们可以通过vi编辑器来查看文件的fo ...

  4. 设置redis开机自动启动

    注意:win7执行命令前面可不需要加路径,win10必须要加路径 命令: redis-server --service-install redis.windows.conf 执行完成之后,打开服务管理 ...

  5. elasticsearch 7版本 基础操作

    elasticsearch 7版本 基础操作 首先我们浏览器http://localhost:5601/进入 kibana里的Console中输入 首先让我们在 Console 中输入: PUT t1 ...

  6. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  7. django获取数据queryset中的filter选项

    2.条件选取querySet的时候,filter表示=,exclude表示!=. querySet.distinct() 去重复__exact 精确等于 like 'aaa' __iexact 精确等 ...

  8. 学习python的日常2

    ---恢复内容开始--- 数组list 添加用.append(i,'xxx')方法 删除用.pop(i)方法,其中i为索引位置 数组可以直接作为元素插入数组 元组tuple(初始化后不能改变,所谓不变 ...

  9. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  10. java写入内容到本地文件 -读取文件内容

    /** 日志记录 * @author sys * @param content 要写入的类容 * @param path 目标路径 c:/log/ * @param filename 文件名 log. ...