社区讨论
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 条回复,欢迎继续交流。
正在加载回复...