社区讨论
WA求调
P14363[CSP-S 2025] 谐音替换参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhphtxo0
- 此快照首次捕获于
- 2025/11/08 07:35 4 个月前
- 此快照最后确认于
- 2025/11/08 08:32 4 个月前
RT
CPP#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int mod=13331;
int hash1[4000005],hash2[4000005];
int n,q;
map<pair<int,int>,bool>mp;
vector<int>frsum,basum;
int str_to_hash(string s){
int cnt=0;
for(int i=0;i<s.size();i++){
int tmp=s[i]-'a';
cnt=(cnt*26+tmp)%mod;
}
return cnt;
}
int qpow(int x,int y){
int ans=1;
while(y){
if(y&1)ans=(ans*x)%mod;
y>>=1;x=(x*x)%mod;
}
return ans;
}
void str_to_hash2(string s,int arr[]){
int cnt=0;
for(int i=0;i<s.size();i++){
int tmp=s[i]-'a';
cnt=(cnt*26+tmp)%mod;
arr[i]=cnt;
}
}
signed main(){
//freopen("replace.in","r",stdin);
// freopen("replace.out","w",stdout);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
string a,b;cin>>a>>b;
string c=a+b;
int leni=c.size();
int hash3i=str_to_hash(c);
mp[make_pair(leni,hash3i)]=true;
}
while(q--){
int ans=0;
string s1,s2;
cin>>s1>>s2;
int len=s1.size();
if(s1.size()!=s2.size()){cout<<"0\n";continue;}
str_to_hash2(s1,hash1);str_to_hash2(s2,hash2);
frsum.clear();basum.clear();
for(int i=0;i<s1.size();i++){
if(hash1[i]==hash2[i]){
frsum.push_back(i);
}
else break;
}
for(int i=s1.size()-1;i>=0;i--){
int ans1=hash1[len-1],ans2=hash2[len-1];
int bi1=(ans1-hash1[i]*qpow(26,len-1-i))%mod,bi2=(ans2-hash2[i]*qpow(26,len-1-i))%mod;
if(bi1==bi2){basum.push_back(i+1);
}
else break;
}
for(auto i:frsum){
for(auto j:basum){
if(i>=j)continue;
int lenn=j-i-1;
//cout<<i<<' '<<j<<'\n';
int mid1=hash1[j-1]-(hash1[i]*qpow(26,lenn))%mod;
int mid2=hash2[j-1]-(hash2[i]*qpow(26,lenn))%mod;
mid1%=mod;mid2%=mod;
int midd=(mid1*qpow(26,lenn)+mid2)%mod;
if(mp[make_pair(2*lenn,midd)]==true)ans++;
}
}
for(auto j:basum){
int lenn=j;
int mid1=hash1[j-1];
int mid2=hash2[j-1];
mid1%=mod;mid2%=mod;
int midd=(mid1*qpow(26,lenn)+mid2)%mod;
if(mp[make_pair(2*lenn,midd)]==true)ans++;
}
cout<<ans<<'\n';
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...