首页 > 其他分享 >字符串专题

字符串专题

时间:2024-07-15 20:21:09浏览次数:12  
标签:专题 return int long Hash 字符串 inline mod

哈希

好用的哈希模数:

  • unsigned long long/long long 自然溢出
  • \(2654435769\)(存疑)
  • \(1610612741\)(极力推荐)
  • \(998244353\),\(10^9+7\)(经典,貌似容易被×)

提供一种 \(N\) 模数哈希的写法:

Luogu P3546

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=a,_i=b;i<=_i;i=-~i)
#define bd(i,a,b) for(int i=a,_i=b;i>=_i;i=~-i)
using namespace std;

const int N=2e6+509,MT=2;

int n,m,f[N],ans,_L;
char s[N];

inline int read(){int x;scanf("%lld",&x);return x;}

inline void write(int x,int F=1)
{
	if(F==0) printf("%lld",x);
	else if(F==1) printf("%lld\n",x);
	else printf("%lld ",x);
}

struct My_Hash
{
	
	int mod=998244353,seed=131;
	int p[N],Pw[N];	
	
	inline int Hash(int l,int r) {return ((p[r]-p[l-1]*Pw[r-l+1]%mod+mod)%mod);}
	
	inline void Pre()
	{
		Pw[0]=1;
		fd(i,1,n)
		{
			p[i]=(p[i-1]*seed+s[i])%mod;
			Pw[i]=Pw[i-1]*seed%mod;
		}
	} 
	
	inline void Named(int _mod_,int _seed_)	{mod=_mod_,seed=_seed_;}
	
}H[MT+1];

inline bool Check_Diff(int l,int r,int L,int R)
{
	fd(i,0,MT)
		if(H[i].Hash(l,r)==H[i].Hash(L,R))
			return 0;
	return 1;
}

inline bool Check_Same(int l,int r,int L,int R)
{
	fd(i,0,MT)
		if(H[i].Hash(l,r)!=H[i].Hash(L,R))
			return 0;
	return 1; 
}

signed main()
{
	
#define FJ
#ifndef FJ
	freopen("bzoj1066_.in","r",stdin);
	freopen("bzoj1066_.out","w",stdout);
#endif
	
	n=read();m=n/2;
	scanf("%s",s+1);
	
	H[0].Named(2654435769,131);//存疑
	H[1].Named(1610612741,131);//Good
	//998244353 1e9+7//貌似容易被×
	
	/*
//	貌似可以(这道题用这种方法可过):
	srand(time(0));
	fd(i,0,MT) H[i].Named((rand()%1000000000)*1000000000+rand()%1000000000,131);
	*/
	
	fd(i,0,MT) H[i].Pre();
	
	bd(i,m,0)
	{
		_L=min(_L+2,m-i);
		while(_L>0&&Check_Diff(i+1,i+_L,n-i-_L+1,n-i)) _L--;
		if(Check_Same(1,i,n-i+1,n)) ans=max(ans,i+_L);
	}
	
	write(ans);
	
	return 0;
	
}

标签:专题,return,int,long,Hash,字符串,inline,mod
From: https://www.cnblogs.com/whrwlx/p/18303888

相关文章

  • 【K8s】专题七(2):Kubernetes 服务发现之 Ingress
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、工作原理三、资源清单(示例)1、IngressController2、Ingress对象四、常用命令一、基本介绍Ingress是Kubernetes提供的一种服务......
  • 20240713总结(搜索专题,但是不想搜索)
    A-DimaandTrapGraphCF366DDimaandTrapGraph题解:考虑二分满足答案区间,但是发现这个区间并不具有单调性。于是我们考虑固定一个端点(不妨固定左端点),然后二分右端点,此时右端点是有单调性的。然后思考如何判断是否联通。这题可以直接使用并查集,把在当前判断的区间内的边并......
  • 数据结构专题
    [NOIP2012]借教室可以看到答案是有单调性的,若第i个可以那么第i-1个也可以,就可以二分答案,用差分维护区间加,也可以用树状数组#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#definedoublelongdouble#definePIIpair<int,int>constintN=1e6......
  • 【力扣 709】转换成小写字母 C++题解(字符串)
    给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。示例1:输入:s=“Hello”输出:“hello”示例2:输入:s=“here”输出:“here”示例3:输入:s=“LOVELY”输出:“lovely”提示:1<=s.length<=100s由ASCII字符集中的可打印字符组......
  • 【力扣 58】最后一个单词的长度 C++题解(字符串)
    给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1:输入:s=“HelloWorld”输出:5解释:最后一个单词是“World”,长度为5。示例2:输入:s="flymetot......
  • C++字符串String和字符串字面量String Literals
    在C++中,字符串(String)是一种用于表示和处理文本数据的基本类型。C++提供了两种主要的字符串类型:C风格字符串(C-StyleString):使用字符数组表示。标准库字符串(std::string):使用标准库中的std::string类表示。1.C风格字符串C风格字符串是一个以空字符(\0)结尾的字符数组。以下是......
  • 二分专题
    二分最重要的就是check函数的编写以及边界的控制1.一定区间的完全平方数个数(除二分以外的简单写法)查看代码cout<<(int)(floor(sqrt(b))-ceil(sqrt(a))+1)<<endl;2.跳石头(为了最大化最小间隙,通过二分跳跃距离,期间通过和撤走石头数量进行比较,来判断此距离是否过短或......
  • 代码随想录算法训练营第10天|232. 用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047.
    学习任务:Leetcode232.用栈实现队列Leetcode225.用队列实现栈Leetcode20.有效的括号Leetcode1047.删除字符串中的所有相邻重复项Leetcode232.用栈实现队列难度:简单|相关标签:栈、设计、队列题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支......
  • 判断字符串相等
    “==”操作符用于比较两个对象的地址是否相等。.equals()方法用于比较两个对象的内容是否相等。Strings1=newString("hh");Strings2=newString("hh");//trueSystem.out.println(s1.equals(s2));//falseSystem.out.println(s1==s2);Object类的equals()/......
  • 字符串拼接
    StringBuilder的append()Strings1="ha";Strings2="xi";//编译的时候被替换成newStringBuilder(s1).append(s2).toString();System.out.println(s1+s2);Strings1="ha";//+号也被编译成了append()Strings2=s1+"";System.ou......