社区讨论

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

正在加载回复...