首页 > 其他分享 >luogu P4465 [国家集训队] JZPSTR

luogu P4465 [国家集训队] JZPSTR

时间:2022-11-24 21:03:02浏览次数:68  
标签:int luogu P4465 db long Ans using 国家集训队 define

题面传送门

我真的,我哭死,如果考了我当场感谢zyq。

听说std是SAM+块链,我瑟瑟发抖,然后祭出了bitset大法。

据说这个是叫一种Shift-And的基于位运算的字符串匹配算法,也就是说,我们维护每个字符在哪些位置上出现过,记\(i\)字符出现在\(f_i\)集合的位置,现有匹配串\(s\),维护当前仍然合法的起始点集合\(p\),则有\(p=p\and (f_{s_i}>>i)\)。

这个东西在平凡情况下会被KMP干爆,但是在这种带修的地方就能显露出优势。修改其实就是将一部分左移,然后加入,删除就是将一部分右移,查询直接按照上面的查询,复杂度就是\(O(\frac{QL}{w})\)

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=1e6+5,M=N*4+5,K=1e5+5,mod=1e9+7,Mod=mod-1,INF=1e9+7;const db eps=1e-5;mt19937 rnd(time(0));
int T,k,op,x,y;char c[N];
bitset<N> f[10],T1,T2,T3,Ans,Cl;
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d",&T);for(i=0;i<1e6;i++) Cl[i]=1;while(T--){
		scanf("%d%d",&op,&x);if(!op){
			scanf("%s",c);k=strlen(c);for(i=0;i<10;i++) T1=(f[i]>>x)<<x,f[i]^=T1,f[i]|=T1<<k;
			for(i=0;i<k;i++) f[c[i]-'0'][x+i]=1;
		}else if(scanf("%d",&y),op==1){
			for(i=0;i<10;i++) T1=(f[i]>>x)<<x,f[i]^=T1,T1=(T1>>y)<<x,f[i]|=T1;
		}else{
			scanf("%s",c);k=strlen(c);if(k>y-x){puts("0");continue;}Ans=Cl;for(i=0;i<k;i++) Ans=Ans&(f[c[i]-'0']>>i);
			Ans>>=x;printf("%d\n",(Ans^((Ans>>y-x-k+1)<<y-x-k+1)).count());
		}
	}
} 

标签:int,luogu,P4465,db,long,Ans,using,国家集训队,define
From: https://www.cnblogs.com/275307894a/p/16923288.html

相关文章

  • luogu1253 [yLOI2018] 扶苏的问题 题解
    扶苏的问题题目题目描述给定一个长度为\(n\)的序列\(a\),要求支持如下三个操作:给定区间\([l,r]\),将区间内每个数都修改为\(x\)。给定区间\([l,r]\),将区间内每......
  • luogu P8500 [NOI2022] 冒泡排序
    题面传送门这个部分分提示得太妙了。首先这个冒泡排序的壳已经被套烂了,就是对逆序对计数。首先观察一下,发现第一个样例解释中在等于某个限制对应的最小值的时候取到逆序......
  • Luogu3410 & 2762 - 最小割 -
    题目链接:https://www.luogu.com.cn/problem/P3410题解:建图就形如这样的:其中左边的点表示客户要求,右边的点表示下属S->左边点断一条边,就说明dismiss这个要求,右边点......
  • Luogu7113 & 4017 - 拓扑排序 -
    题目链接:https://www.luogu.com.cn/problem/P7113题解:7113拓扑排序一下,从每个开始点放水,每次*1/size扩展一下即可。要用__int1284017按照拓扑序简单dp一下//byS......
  • Luogu P1453 城市环路(基环树DP)
    法一:dsu#include<bits/stdc++.h>usingll=longlong;usingnamespacestd;constintN=100010;structnode{intv,nxt;}e[N......
  • P4464 [国家集训队] JZPKIL 题解
    NOIP前三天,感觉绝对复习不完了的gtm1514认为已经没有什么好害怕的了,于是做起了数学题。因为摆了大烂所以只有一道。P4464[国家集训队]JZPKIL题意不再赘述。下午看......
  • luogu2654 原核生物培养
    P2654原核生物培养在洛谷打开一看就一道蓝题——提高+/省选-,看起来有点难度,实际上很简单。这是一道环形dp+堆排序的题目。我们把它分为两个部分,一个是排序部分,一个是环......
  • luogu P8859 冒泡排序
    题面传送门首先\(type=1\)的情况是平凡的,设可以发现一个数不需要被操作当且仅当这个数前面的数都小于这个数。可以设计出这样的dp:设\(f_{i,j}\)表示到了第\(i\)个数,前面有......
  • Luogu P1306 斐波那契数列公约数
    斐波那契公约数题目描述对于Fibonacci数列:\[f_i=\begin{cases}[i=1]&i\leq1\\f_{i-1}+f_{i-2}&i\gt1\end{cases}\]请求出......
  • Luogu2046 海拔 - 网络流 - 最短路 -
    题目链接:https://www.luogu.com.cn/problem/P2046首先观察可以发现最优解一定是左上部分是全0,右下是全1这样的形式然后题目就相当于让我们求一个\((1,1)\rightarrow(n......