Barty’s Computer 西安网赛 字符哈希

题目链接:https://nanti.jisuanke.com/t/17122

比赛的时候去用树链剖分乱搞那个xor了Orzzzzz……

要是当时做出来这个题就好了QAQ

就……裸的字符哈希

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD=1e15+9;
LL pow26[2000005]={1};
string a,b,c,d;
struct pcs
{
	string s;
	int len;
	vector<LL> h1,h2,h3,h4;
};
vector<pcs> v;
inline void Add(string &s)
{
	vector<int> h1,h2,h3,h4;
	int len=s.length()/2;
	h1.push_back(s[0]-'a');
	h3.push_back(s[len]-'a');
	for(int i=1;i<len;i++) h1.push_back(h1[i-1]+(s[i]-'a')*pow26[i]);
	for(int i=1;i<len;i++) h3.push_back(h3[i-1]+(s[len+i]-'a')*pow26[i]);
	h2.push_back(s[len-1]-'a');
	h4.push_back(s[2*len-1]-'a');
	for(int i=1;i<len;i++) h2.push_back(h2[i-1]+(s[len-1-i]-'a')*pow26[i]);
	for(int i=1;i<len;i++) h4.push_back(h4[i-1]+(s[2*len-1-i]-'a')*pow26[i]);
//	cout<<"Debug "<<1<<endl;
//	cout<<"h1"<<" ";for(int i=0;i<len;i++) cout<<h1[i]<<" ";cout<<endl;
//	cout<<"h2"<<" ";for(int i=0;i<len;i++) cout<<h2[i]<<" ";cout<<endl;
//	cout<<"h3"<<" ";for(int i=0;i<len;i++) cout<<h3[i]<<" ";cout<<endl;
//	cout<<"h4"<<" ";for(int i=0;i<len;i++) cout<<h4[i]<<" ";cout<<endl;
	v.push_back((pcs){s,len,h1,h2,h3,h4});
}
inline int query()
{
	int ans=0;
	int lena=a.length();
	int lenb=b.length();
	int lenc=c.length();
	int lend=d.length();
	LL ha=0,hb=0,hc=0,hd=0;
	for(int i=0;i<lena;i++) ha=(ha+(a[i]-'a')*pow26[i])%MOD;
	for(int i=0;i<lenb;i++) hb=(hb+(b[lenb-i-1]-'a')*pow26[i])%MOD;
	for(int i=0;i<lenc;i++) hc=(hc+(c[i]-'a')*pow26[i];
	for(int i=0;i<lend;i++) hd+=(d[lend-i-1]-'a')*pow26[i];
//	cout<<"Debug "<<ha<<" "<<hb<<" "<<hc<<" "<<hd<<endl;
	for(int i=0;i<v.size();i++)
	{
		if (v[i].len<lena+lenb) continue;
		if (v[i].len<lenc+lend) continue;
		if (v[i].h1[lena-1]==ha && v[i].h2[lenb-1]==hb && v[i].h3[lenc-1]==hc && v[i].h4[lend-1]==hd)
			ans++;
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	LL tmp=1;
	for(int i=1;i<=2000000;i++) pow26[i]=(pow26[i-1]*26)%MOD;
	int T;
	cin>>T;
	while(T--)
	{
		v.clear();
		int Q;
		cin>>Q;
		while(Q--)
		{
			int op;
			string s;
			cin>>op>>s;
			if (op==1) Add(s);
			else
			{
				a=s;
				cin>>b>>c>>d;
				cout<<query()<<endl;
			}
		}
	}
	return 0;
}

Write a Reply or Comment

Your email address will not be published.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据