社区讨论
莫名空间RE求条
P14363[CSP-S 2025] 谐音替换参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhr2gfx4
- 此快照首次捕获于
- 2025/11/09 10:00 3 个月前
- 此快照最后确认于
- 2025/11/16 14:03 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef pair<ull,ull> puu;
const ull p=131;
const int N=2e5+25;
int n,q;
string s[3],t[3];
int l[N],ll[N];
ull hs[N][3];
ull pp[5000005];
map<puu,int>mp[30003];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>q;pp[0]=1;
for(int i=1;i<=5000001;i++)pp[i]=pp[i-1]*p;
for(int i=1;i<=n;i++){
for(int tt=1;tt<3;tt++){
cin>>s[tt];
for(int j=0;j<s[tt].size();j++){
(hs[i][tt]*=p)+=s[tt][j];
}
}
ll[i]=l[i]=s[1].length();
}
sort(ll+1,ll+1+n);
int ln=unique(ll+1,ll+1+n)-ll-1;
for(int i=1;i<=n;i++){
int pos=lower_bound(ll+1,ll+1+ln,l[i])-ll;
mp[pos][make_pair(hs[i][1],hs[i][2])]++;
}
while(q--){
int ans=0;
cin>>t[1]>>t[2];
if(t[1]==t[2]){
cout<<"1\n";
continue;
}
if(t[1].size()!=t[2].size()){
cout<<"0\n";
continue;
}
int len=t[1].size();
int lk[2]={0,len};
while(lk[0]+1<len&&t[1][lk[0]]==t[2][lk[0]])++lk[0];
while(lk[1]>0&&t[1][lk[1]-1]==t[2][lk[1]-1])--lk[1];
for(int i=lower_bound(ll+1,ll+1+ln,lk[1]-lk[0])-ll;i<=ln&&ll[i]<=t[1].size();i++){
int st=max(0,lk[1]-ll[i]);
ull ths[3]={0,0,0};
for(int tt=1;tt<3;tt++){
for(int j=0;j<ll[i];j++){
(ths[tt]*=p)+=t[tt][st+j];
}
}
puu tu=make_pair(ths[1],ths[2]);
if(mp[i].find(tu)!=mp[i].end())ans+=mp[i][tu];
for(int j=st+1;j<=lk[0];j++){
for(int tt=1;tt<3;tt++){
((ths[tt]-=t[tt][j-1]*pp[ll[i]-1])*=p)+=t[tt][j+ll[i]-1];
}
puu tu=make_pair(ths[1],ths[2]);
if(mp[i].find(tu)!=mp[i].end())ans+=mp[i][tu];
}
}
cout<<ans<<'\n';
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...