首页 > 其他分享 >【做题纪要】4月“祝祷转过千年诗篇”- 『雪山之眼』

【做题纪要】4月“祝祷转过千年诗篇”- 『雪山之眼』

时间:2024-04-09 09:44:26浏览次数:27  
标签:祝祷 oldrk int cnt tot sa rk 纪要 之眼

(做题纪要前放点闲话应该没啥问题...吧?)

禾念你虽然pv里的藏文格式全都错了但是应该不至于直接把藏文全删了吧(

还有天依游学记怎么这么快就还剩十几天就要完结了,哭哭

哎我游学记的谷子怎么还不到

P2408 不同子串个数

板子题,最后结果为 \(\dfrac{n(n-1)}{2}-\sum\limits_{i=2}^{n}\text h_i\)

这个我应该在学习笔记里写了,这里挂一下

代码

点击查看代码
namespace solve{
	int height[N],sa[N],oldsa[N],rk[N],oldrk[N],cnt[N],key[N];
	namespace SA{
		inline bool cmp(int x,int y,int w){
			return (oldrk[x]==oldrk[y])&&(oldrk[x+w]==oldrk[y+w]);
		}
		inline void Init(char *s){
			int n=strlen(s+1),m=127,tot;
			for_(i,1,n) 
				rk[i]=s[i],
				++cnt[rk[i]];
			for_(i,1,m) 
				cnt[i]+=cnt[i-1];
			_for(i,n,1) sa[cnt[rk[i]]--]=i;
			for(int w=1;;w<<=1,m=tot) {
				tot=0;
				_for(i,n,n-w+1) 
					oldsa[++tot]=i;
				for_(i,1,n)
					if(sa[i]>w) 
						oldsa[++tot]=sa[i]-w;
				memset(cnt,0,sizeof(cnt));
				for_(i,1,n) 
					++cnt[key[i]=rk[oldsa[i]]];
				for_(i,1,m) 
					cnt[i]+=cnt[i-1];
				_for(i,n,1) 
					sa[cnt[key[i]]--]=oldsa[i];
				memcpy(oldrk+1,rk+1,n*sizeof(int));
				tot=0;
				for_(i,1,n)
					rk[sa[i]]=((cmp(sa[i],sa[i-1],w))?(tot):(++tot));
				if(tot==n)
					break;
			}
		}
		inline void Init_H(char *s){
			int n=strlen(s+1),tot=0;
			for_(i,1,n){
				if(!rk[i]) continue;
				if(tot) --tot;
        		while(s[i+tot]==s[sa[rk[i]-1]+tot]) ++tot;
				height[rk[i]]=tot;
			}
		}
	}
	using namespace SA;
	inline void In(){
		int n,ans=0;
		char s[N];
		FastI>>n>>(s+1);
		Init(s);Init_H(s);		
		for_(i,2,n) ans+=height[i];
		FastO<<((n*(n+1)/2)-ans)<<endl;
	}
}
using namespace solve;

P3181 「HAOI2016」找相同字符

大到小扫描 \(height\) 数组,合并相邻后缀

当前块中的贡献就是第一个串的后缀数 $\times $ 第二个串的后缀数 \(\times\) 当前枚举的height。

用并查集维护即可

代码

点击查看代码
namespace solve{
	int height[N],sa[N],oldsa[N],rk[N],oldrk[N],cnt[N],key[N];
	namespace SA{
		inline bool cmp(int x,int y,int w){
			return (oldrk[x]==oldrk[y])&&(oldrk[x+w]==oldrk[y+w]);
		}
		inline void Init(char *s){
			int n=strlen(s+1),m=127,tot;
			for_(i,1,n) 
				rk[i]=s[i],
				++cnt[rk[i]];
			for_(i,1,m) 
				cnt[i]+=cnt[i-1];
			_for(i,n,1) sa[cnt[rk[i]]--]=i;
			for(int w=1;;w<<=1,m=tot) {
				tot=0;
				_for(i,n,n-w+1) 
					oldsa[++tot]=i;
				for_(i,1,n)
					if(sa[i]>w) 
						oldsa[++tot]=sa[i]-w;
				memset(cnt,0,sizeof(cnt));
				for_(i,1,n) 
					++cnt[key[i]=rk[oldsa[i]]];
				for_(i,1,m) 
					cnt[i]+=cnt[i-1];
				_for(i,n,1) 
					sa[cnt[key[i]]--]=oldsa[i];
				memcpy(oldrk+1,rk+1,n*sizeof(int));
				tot=0;
				for_(i,1,n)
					rk[sa[i]]=((cmp(sa[i],sa[i-1],w))?(tot):(++tot));
				if(tot==n)
					break;
			}
		}
		inline void Init_H(char *s){
			int n=strlen(s+1),tot=0;
			for_(i,1,n){
				if(!rk[i]) continue;
				if(tot) --tot;
        		while(s[i+tot]==s[sa[rk[i]-1]+tot]) ++tot;
				height[rk[i]]=tot;
			}
		}
	}
	using namespace SA;
	int f[N],g[N],A[N],B[N];
    inline bool cmp1(int a,int b){
		return height[a]>height[b];
	}
	inline int find(int x){
		return f[x]=((f[x]!=x)?find(f[x]):x);
	}
	char s1[N],s2[N],s[N];
	inline void In(){
		FastI>>(s1+1)>>(s2+1);
		int len1=strlen(s1+1);
		int len2=strlen(s2+1);
		int n=len1+len2+1;
		for_(i,1,n){
			if(i==len1+1) s[i]='#';
			else if(i<=len1) s[i]=s1[i];
			else s[i]=s2[i-len1-1];
		}
		Init(s);Init_H(s);
        for_(i,1,n){
            g[i]=i+1;f[i]=i;
            if(sa[i]>len1+1) B[i]=1;
            if(sa[i]<=len1) A[i]=1;
        }
        sort(g+1,g+1+n,cmp1);
        int ans=0;
        for_(i,1,n-1){
            int x=find(g[i]),y=find(g[i]-1);
            ans+=(A[x]*B[y]+A[y]*B[x])*height[g[i]];
            A[y]+=A[x];B[y]+=B[x];
            f[x]=y;
        }
        write(ans);
    }
}

P4081「USACO 2017.12 Platinum」Standing Out from the Herd P

标签:祝祷,oldrk,int,cnt,tot,sa,rk,纪要,之眼
From: https://www.cnblogs.com/Vsinger-LuoTianYi/p/18121619

相关文章

  • 2024.4 做题纪要
    aaaaaaaaaaaaaaaaa大致是在成七集训,虽然挺多都是3月底的不过还是整一下。目录2024.3.30T2简单题2024.4.1T3木棍AGC059EGrid3-coloring2024.4.2T1斩首(Gym104901F)T3战争2024.4.5T3Text2024.4.7CF1707DPartialVirtualTreesCF1874EJellyfishandHack2024.3.30T2......
  • 【做题纪要】衡实初三模拟测试三
    本来以为打完最多能拿\(120\)分所以没打,事实上自己做法能拿\(170\)分也就能到rk1,血亏本次模拟赛不知道怎么拼出来的,一共4道题有3道题需要文件输出,最后出现了9道题的题解都没写代码,凑合着看,思路肯定是能过的(吧?)网格图这个题一眼过去可以用暴力bfs来打,复杂度\(O(n^2k^2)\)可......
  • 设计模式学习纪要(三)
    (五)代理模式(结构型模式)代理模式定义代理模式就是为一个对象(被代理对象)提供一个代理对象,并且通过代理对象控制对原来被代理对象的访问。可以简单理解为通过代理对象访问目标对象。这样做最大的好处就是可以在目标对象实现的基础上,增强额外的功能,起到扩展目标对象的效果。代......
  • 2024.3 做题纪要
    省选考的一塌糊涂,学了约半个月whk。模拟赛不知道有没有比较需要写的,看情况,更新可能很少,主要用来写题解。目录2024.3.16P10218[省选联考2024]魔法手杖P10220[省选联考2024]迷宫守卫2024.3.19P10198[USACO24FEB]InfiniteAdventureP2024.3.16算是开始集训了,虽然还是不......
  • 2024年深度之眼--科研助理面试题
    深度之眼--科研助理面试题请将答案写在每道题的后面,Word文档命名为自己的名字,通过邮件/微信回复提交。一、选择题1.如何安装pytorch?(A)A使用pipB使用apt-getC下载源代码变异D无法安装2.pytorch中张量的阶数表示什么?(C)A张量的大小B张量的形状C张量的维度D......
  • 数据之眼:透视货运火车站的高效运作
    货运火车站作为物流的重要枢纽,每天都在处理着海量的货物和运输任务。然而,对于大多数人来说,货运火车站依旧是一个神秘而复杂的世界。今天让我们通过可视化技术,一起走进货运火车站,感受其中的魅力与奥秘。 一、数据的魔力:货运火车站的透明化在货运火车站中,可视化技术发挥着至关重......
  • 2024寒假集训纪要 & 闲话 (下半)
    2.16本来说要写\(4\)道多项式的题的,到最后算上\(\text{AC}\)自动机之类的也没\(4\)道题\(\color{white}{唔,我好想补完春节期间在家看的『约会大作战(第三部)』啊,但是我没有【数据删除】所以看不了诶}\)明天似乎有模拟赛?寄寄寄寄寄寄寄寄寄寄搞了个题单,但是看起来意义不......
  • 2024.2 训练纪要
    目录2024.2.15R35T2弱化的杨表R35T3达拉然的废墟THUWC+NOIWC+过年完了,得滚回来打模拟赛了。快要省选了哈哈。要寄大了。WC2024游记可能还是会持续更新的,毕竟讲的题整理没整理完代码也一个都没写,有点傻逼。2024.2.15100/100/20,sum220,rk12/98我这波是致......
  • 2024.1.30做题纪要
    [bzoj3569]DZYLovesChineseII第一眼:这和线性基有什么关系。。。第二眼:这到底跟线性基有什么关系???对于一个图,我们先想建树,然后加返祖边。我们考虑一下对于一个点什么情况才会出现不连通的情况???当连接这个点的树边和跨过这个点的非树边都断开时不连通。那我们怎么判断是不是都......
  • 寒假集训纪要
    1.28KMP算法匹配intj;j=0;for(inti=1;i<=la;++i){while(j&&b[j+1]!=a[i])j=next[j];if(b[j+1]==a[j])j++;if(j==lb){cout<<i-lb+1<<'\n';j=next[j];}}处理next数组j=0;for(inti=2;......