ABC 250 E

E - Prefix Equality(哈希)

题意

给定两个等长数组a,b,每次询问a的前x个元素组成的集合是否等于b的前y个元素组成的集合

思路

因为它有个限制条件,区间都是[1,x],所以轻松一点,要是询问a的某一段区间与b的某一段区间相等,就不会做了。
直接上哈希,自然溢出。

代码

vector<int> a,b;
vector<ull> ha,hb;

ull q_pow(int a,int b) 
{
	ull res=1;
	while(b) 
	{
		if(b&1) res=res*a;
		a=a*a;
		b/=2;
	}
	return res;
}

vector<ull> hash_(vector<int>&a)
{
	int len=a.size();
	ull h=0;
	vector<ull> hash(n);
	set<ull> s;
	for(int i=0;i<len;i++) 
	{
		if(!s.count(a[i]))
		{
			s.insert(a[i]);
			h+=q_pow(mod,a[i]);
		}
		hash[i]=h;
	}
	return hash;
}

void solve() 
{
	cin>>n;
	for(int i=0;i<n;i++) 
	{
		int x;
		cin>>x;
		a.push_back(x);
	}
	for(int i=0;i<n;i++) 
	{
		int x;
		cin>>x;
		b.push_back(x);
	}
	ha=hash_(a);
	hb=hash_(b);
	cin>>m;
	while(m--) 
	{
		int x,y;
		cin>>x>>y;
		--x,--y;
		if(ha[x]==hb[y]) cout<<"Yes\n";
		else cout<<"No\n";
	}
}
posted @ 2023-02-25 13:56  Liang2003  阅读(11)  评论(0编辑  收藏  举报