社区讨论

AC 自动机 60pts TLE 求调

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhixom81
此快照首次捕获于
2025/11/03 17:24
4 个月前
此快照最后确认于
2025/11/08 07:50
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,q;
struct node{
    int son[27],fail,cnt,sum;
}tr[5000005];
int cnt;
vector<int> e[5000005],to;
string change(string a,string b){
    int l,r;
    string c;
    for(l=0;l<a.size()&&a[l]==b[l];l++);
    for(r=a.size()-1;r>=0&&a[r]==b[r];r--);
    for(int j=0;j<l;j++)c+=a[j];
    c+='z'+1;
    for(int j=l;j<=r;j++)c+=a[j];
    for(int j=l;j<=r;j++)c+=b[j];
    c+='z'+1;
    for(int j=r+1;j<a.size();j++)c+=a[j];
    return c;
}
void insert(string s){
    int p=0;
    for(auto i:s){if(!tr[p].son[i-'a'])tr[p].son[i-'a']=++cnt;p=tr[p].son[i-'a'];}
    tr[p].cnt++;
}
void build(){
    queue<int> q;
    for(int i=0;i<27;i++){if(tr[0].son[i])q.push(tr[0].son[i]);}
    while(!q.empty()){
        int p=q.front();
        for(int i=0;i<27;i++){if(tr[p].son[i])tr[tr[p].son[i]].fail=tr[tr[p].fail].son[i],q.push(tr[p].son[i]);else tr[p].son[i]=tr[tr[p].fail].son[i];}
        q.pop();
    }
}
void top(){
    queue<int> q;
    q.push(0);
    while(!q.empty()){int p=q.front();to.push_back(p);for(auto i:e[p])q.push(i);q.pop();}
}
int query(string x){
    for(int i=0;i<=cnt;i++)tr[i].sum=0;
    int p=0;
    for(auto i:x){p=tr[p].son[i-'a'];tr[p].sum++;}
    for(int i=to.size()-1;i>=0;i--){tr[tr[to[i]].fail].sum+=tr[to[i]].sum;}
    int res=0;
    for(int i=1;i<=cnt;i++)res+=tr[i].sum*tr[i].cnt;
    return res;
}
int main(){
    cin>>n>>q;
    for(int i=0;i<n;i++){
        string a,b,c;
        cin>>a>>b;
        if(a==b)continue;
        c=change(a,b);
        insert(c);
    }
    build();
    for(int i=1;i<=cnt;i++)e[tr[i].fail].push_back(i);
    top();
    for(int i=0;i<q;i++){
        string a,b,c;
        cin>>a>>b;
        if(a.size()!=b.size())cout<<"0\n";
        c=change(a,b);
        cout<<query(c)<<endl;
    }
    return 0;
}

回复

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

正在加载回复...