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; }