hash求助!!!
查看原帖
hash求助!!!
463210
zzzYheng楼主2021/7/15 10:13

结果

#include<bits/stdc++.h>
#define int long long
const int MAXN=2e6+10;
const int Base=131;
const int MOD=2147364847;
int n;
char s[MAXN];
int hash[MAXN],mypow[MAXN];
int flag,p;
void init(char *s,int len)
{
	int i,j;
	hash[0]=0;
	mypow[0]=1;
	for(i=1;i<=len;i++)
	{
		hash[i]=hash[i-1]*Base+(int)(s[i]);
		hash[i]%=MOD;
		mypow[i]=mypow[i-1]*Base;
		mypow[i]%=MOD;
	}
}
int gethash(int l,int r)
{
	return (hash[r]-hash[l-1]*mypow[Base,r-l+1]%MOD+MOD)%MOD;
}
int check(char *s,int len,int k)
{
	int mid=(len>>1)+1,tmp1,tmp2;
	if(k<mid)
	{
		tmp1=(gethash(1,k-1)*mypow[Base,mid-k]%MOD+gethash(k+1,mid))%MOD;
		tmp2=gethash(mid+1,len);
		if(tmp1==tmp2) return 1;
		else return 0;
	}
	else if(k>mid)
	{
		tmp1=gethash(1,mid-1);
		tmp2=(gethash(mid,k-1)*mypow[Base,len-k]%MOD+gethash(k+1,len))%MOD;
		if(tmp1==tmp2) return 1;
		else return 0;
	}
	else
	{
		tmp1=gethash(1,mid-1);
		tmp2=gethash(mid+1,len);
		if(tmp1==tmp2) return 1;
		else return 0;
	}
}
void wri(char *s,int len,int k)
{
	int i,mid=(len>>1)+1;
	if(k<=mid)
	{
		for(i=1;i<k;i++) printf("%c",s[i]);
		for(i=k+1;i<=mid;i++) printf("%c",s[i]);
	}
	else if(k>mid)
	{
		for(i=1;i<=mid;i++) printf("%c",s[i]);
	}
}
signed main()
{
	int i,j;
	std::cin>>n;
	std::cin>>s+1;
	if(n%2==0)
	{
		std::cout<<"NOT POSSIBLE";
		return 0;
	}
	init(s,n);
	for(i=1;i<=n;i++)
		if(check(s,n,i)==1)
			flag++,p=i;
	if(flag==0)
		std::cout<<"NOT POSSIBLE";
	else if(flag>1)
		std::cout<<"NOT UNIQUE";
	else
		wri(s,n,p);
	return 0;
}#include<bits/stdc++.h>
#define int long long
const int MAXN=2e6+10;
const int Base=131;
const int MOD=2147364847;
int n;
char s[MAXN];
int hash[MAXN],mypow[MAXN];
int flag,p;
void init(char *s,int len)
{
	int i,j;
	hash[0]=0;
	mypow[0]=1;
	for(i=1;i<=len;i++)
	{
		hash[i]=hash[i-1]*Base+(int)(s[i]);
		hash[i]%=MOD;
		mypow[i]=mypow[i-1]*Base;
		mypow[i]%=MOD;
	}
}
int gethash(int l,int r)
{
	return (hash[r]-hash[l-1]*mypow[Base,r-l+1]%MOD+MOD)%MOD;
}
int check(char *s,int len,int k)
{
	int mid=(len>>1)+1,tmp1,tmp2;
	if(k<mid)
	{
		tmp1=(gethash(1,k-1)*mypow[Base,mid-k]%MOD+gethash(k+1,mid))%MOD;
		tmp2=gethash(mid+1,len);
		if(tmp1==tmp2) return 1;
		else return 0;
	}
	else if(k>mid)
	{
		tmp1=gethash(1,mid-1);
		tmp2=(gethash(mid,k-1)*mypow[Base,len-k]%MOD+gethash(k+1,len))%MOD;
		if(tmp1==tmp2) return 1;
		else return 0;
	}
	else
	{
		tmp1=gethash(1,mid-1);
		tmp2=gethash(mid+1,len);
		if(tmp1==tmp2) return 1;
		else return 0;
	}
}
void wri(char *s,int len,int k)
{
	int i,mid=(len>>1)+1;
	if(k<=mid)
	{
		for(i=1;i<k;i++) printf("%c",s[i]);
		for(i=k+1;i<=mid;i++) printf("%c",s[i]);
	}
	else if(k>mid)
	{
		for(i=1;i<=mid;i++) printf("%c",s[i]);
	}
}
signed main()
{
	int i,j;
	std::cin>>n;
	std::cin>>s+1;
	if(n%2==0)
	{
		std::cout<<"NOT POSSIBLE";
		return 0;
	}
	init(s,n);
	for(i=1;i<=n;i++)
		if(check(s,n,i)==1)
			flag++,p=i;
	if(flag==0)
		std::cout<<"NOT POSSIBLE";
	else if(flag>1)
		std::cout<<"NOT UNIQUE";
	else
		wri(s,n,p);
	return 0;
}

改了无数个模数都是这个结果

2021/7/15 10:13
加载中...