传送门

题目条件"两个子串\(S[l_1,r_1],S[l_2,r_2]\)完全相同"等价于\(\forall i \in[0,r_1-l_1+1],S_{l1+i}=S_{l_2+i}\),然后所有相同位置的都要选一种数字,把所有相同的放在一个集合,然后记集合个数为\(cn\)那么答案就是\(9*10^{cn-1}\),因为第一位不为0,然后就可以暴力并查集做到\(O(n^2)\)了

发现这样的连边是一个区间对应向另一个区间连边,可以考虑优化.因为连边要一一对应,所以可以ST表优化连边.就是每个点拆出\(log\)个点,代表以这个点为左端点的长度为\(2^k\)的区间,然后每次两个区间二进制拆分一下,在对应的点连边就好了个鬼.不过这样还是不对的,最后还要把这些连的边的作用发挥出来,就从上往下遍历ST表的每一层,某个点如果在当前层的根不是自己,那么就把自己的左儿子,右儿子分别向根的两个儿子连边,然后做下去

#include<bits/stdc++.h>
#define LL long long
#define db long double
#define il inline
#define re registerusing namespace std;
const int N=1e5+10,mod=1e9+7;
il LL rd()
{LL x=0,w=1;char ch=0;while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
int n,m,lz,ff[N][17],l2[N];
int findf(int x,int i){return ff[x][i]==x?x:ff[x][i]=findf(ff[x][i],i);}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;}return an;}int main()
{n=rd(),m=rd();lz=log2(n);for(int j=0;j<=lz;++j) l2[1<<j]=j;for(int j=0;j<=lz;++j)for(int i=1;i+(1<<j)-1<=n;++i)ff[i][j]=i;while(m--){int l=rd(),r=rd(),ll=rd(),rr=rd();if(l==ll) continue;rr=rr-ll+1;while(rr){int x=rr&(-rr),y=l2[x];ff[findf(l,y)][y]=findf(ll,y);l+=x,ll+=x;rr-=x;}}for(int j=lz;j;--j){for(int i=1;i+(1<<j)-1<=n;++i)if(i!=findf(i,j))ff[findf(i,j-1)][j-1]=findf(findf(i,j),j-1),ff[findf(i+(1<<(j-1)),j-1)][j-1]=findf(findf(i,j)+(1<<(j-1)),j-1);}int cn=0;for(int i=1;i<=n;++i) cn+=i==findf(i,0);printf("%lld\n",9ll*fpow(10,cn-1)%mod);return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/10537890.html

luogu P3295 [SCOI2016]萌萌哒相关推荐

  1. P3295 [SCOI2016]萌萌哒(DP+倍增)

    P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结 ...

  2. p3295 [SCOI2016]萌萌哒

    传送门 分析 我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可 当然我们这样做修改是省 ...

  3. 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)

    传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...

  4. BZOJ4569: [Scoi2016]萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 961  Solved: 464 [Submit][Statu ...

  5. luogu P3293 [SCOI2016]美味

    传送门 异或最大值应该是要用\(trie\)树,从高位往低位贪心,虽然这里询问区间的数都要加上\(x\),但是仍然可以利用这个思想 从高往低位考虑,我们要找一个加上\(x\)后当前二进制位\(j\)不 ...

  6. bzoj4569 [Scoi2016]萌萌哒 并查集+st表

    这个题非常巧妙,它描述了一种新的延迟标记关系.. 正常的线段树是用n*4的空间描述一个序列,所以对于一段区间,有可能会有log个点对应一个点 而线段树是利用尽量小的空间使查询变为log st表是nlo ...

  7. bzoj4569[Scoi2016]萌萌哒

    Description 给出一个有n位的无前导0正整数,再给出m个限制,每个限制形如l1-r1,l2..r2表示这个数的l1~r1位和第l2~r2位是相等的.求这样的数的个数. n,m<=10^ ...

  8. [bzoj4569][SCOI2016]萌萌哒

    题目大意 有一个无前导0的n位数,有m个限制形如[l1,r1]=[l2,r2],问满足条件的数有多少种,答案模10^9+7. 倍增 我们用ST表,f[i,j]表示[i,i+2^j-1]这一段. 那么初 ...

  9. BZOJ4569 [Scoi2016]萌萌哒

    一眼觉得是并查集,yy了一下线段树优化发现不可sing,orz了ljss神犇被告知是倍增优化 倍增,一个点[i][j]代表某个i往后2^j个数,把点按倍增次数分层,两个同层的点在一个连通块说明两个点所 ...

最新文章

  1. CUDA运行时 Runtime(二)
  2. halcon与QT联合:(5.3)瓶盖检测以及QT界面搭建
  3. 外贸网站制作 网页的宽度多少为合适
  4. Python Matplotlib.pyplot 中文显示异常的简单解决方法
  5. sql2005收集作业相关历史记录
  6. Windows下安装Apache 2.2.21图文教程
  7. 棋子--状态压缩dp
  8. leetcode172. 阶乘后的零 最快算法
  9. java整蛊小游戏源码_Java 开发打飞机小游戏(附完整源码)
  10. 基于Pandas的数据清洗
  11. 4059. 统计某指定字符出现个数
  12. 【毕业答辩】如何制作优秀的毕业论文答辩PPT?
  13. 【青草识别】基于matlab GUI形态学马唐草+牛筋草识别【含Matlab源码 1041期】
  14. js全屏图片画廊幻灯片插件
  15. 如何建立高效的需求管理机制?
  16. 杭州电子科技大学计算机专业考研分数线,2021年杭州电子科技大学计算机考研分数线等数据分析...
  17. 毕业旅行之天府之国——徒步峨眉
  18. Python写幂函数
  19. 稿费一般多少钱一千字_写网络小说能挣多少钱,稿费都是怎么算的?
  20. 拼图游戏 java_Java实现拼图游戏

热门文章

  1. Qt 两个Ui 界面传值
  2. 禁止微信公众号页面上下滑动
  3. JS之数组删除/添加项目方法splice
  4. Vue基础之Vue实例
  5. Github|类别不平衡学习资源(下)
  6. [GAN学习系列2] GAN的起源
  7. 假设以邻接矩阵作为图的存储结构_图的存储
  8. (转)深入理解Java中的final关键字
  9. py 的 第 30 天
  10. SQL Server中使用自定义指定顺序排序