社区讨论

莫名空间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 条回复,欢迎继续交流。

正在加载回复...