社区讨论

45分 不知道哪里错了

P14363[CSP-S 2025] 谐音替换参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhixpb96
此快照首次捕获于
2025/11/03 17:25
4 个月前
此快照最后确认于
2025/11/08 07:50
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int L=1e7+9+6e5;
int n,q;
string S,T,S1,S2,T1,T2;
string merg(string A,string B){
    int len=A.size();
    int L=0,R=len-1;
    while(A[L]==B[L])L++;
    while(A[R]==B[R])R--;
    string Res;
    if(L==0){
        if(R==A.size()-1){Res="{"+A+"|"+B+"}";}
        else {Res="{"+A.substr(0,R-L+1)+"|"+B.substr(0,R-L+1)+"}"+B.substr(R+1,len);}
    }
    else {
        if(R==A.size()-1){Res=A.substr(0,L)+"{"+A.substr(L,R-L+1)+"|"+B.substr(L,R-L+1)+"}";}
        else {Res=A.substr(0,L)+"{"+A.substr(L,R-L+1)+"|"+B.substr(L,R-L+1)+"}"+B.substr(R+1,len);}
    }return Res;
}
struct ACAM{
    int pcnt;
    struct node{
        int son[30],fail;
    }t[L];
    int Ans[L];
    vector<int> G[L];
    void ins(string s){
        int p=0;
        int len=s.size();
        for(int i=0;i<len;i++){
            int ch=s[i]-'a';
            if(!t[p].son[ch])t[p].son[ch]=++pcnt;
            p=t[p].son[ch];
        }
        Ans[p]++;
    }
    void Fail(){
        queue<int> Q;
        for(int i=0;i<30;i++)
            if(t[0].son[i])Q.push(t[0].son[i]);
        while(!Q.empty()){
            auto now=Q.front();Q.pop();
            for(int i=0;i<30;i++){
                if(!t[now].son[i])t[now].son[i]=t[t[now].fail].son[i];
                else {
                    t[t[now].son[i]].fail=t[t[now].fail].son[i];
                    G[t[t[now].fail].son[i]].push_back(t[now].son[i]);
                    Q.push(t[now].son[i]);
                }
            }
        }
    }
    void dfs(int u){
        for(auto v:G[u]){
            Ans[v]+=Ans[u];
            dfs(v);
        }
    }
    void build(){Fail();dfs(0);}
    int Query(string _){
        int ans=0,p=0,len=_.size();
        bool chk=false;
        for(int i=0;i<len;i++){
            if(_[i]=='}')chk=true;
            int ch=_[i]-'a';
            p=t[p].son[ch];
            if(chk)ans+=Ans[p];
        }return ans+Ans[0];
    }
}Ac;
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>S1>>S2;
        if(S1==S2)continue;
        S=merg(S1,S2);
        Ac.ins(S);
    }Ac.build();
    for(int i=1;i<=q;i++){
        cin>>T1>>T2;
        if(T1.size()!=T2.size())cout<<"0\n";
        else {
            T=merg(T1,T2);
            cout<<Ac.Query(T)<<"\n";
        }
    }
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...