社区讨论
求助样例均过but5pts
P14363[CSP-S 2025] 谐音替换参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjbj0e8m
- 此快照首次捕获于
- 2025/12/18 22:18 3 个月前
- 此快照最后确认于
- 2025/12/20 21:40 3 个月前
哪位大佬帮忙改进一下算法
别告诉我AC自动机解
CPP别告诉我AC自动机解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef string str;
struct node{
str md1,md2,lef,rig,midd,mid1;
ll lp,rp;
}st[200001];
map<str,map<str,ll> >ans;
ll n,q,pl,pr;
str st1,st2,Left,Right,mid,mid2;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for (ll i=1;i<=n;i++){
cin>>st1>>st2;
if (st1==st2){
st[i].md1=st[i].md2=st1;
st[i].lef=-1;
}
pl=0,pr=st1.size()-1;
while (st1[pl]==st2[pl]) pl++;
while (st1[pr]==st2[pr]) pr--;
st[i].lp=pl,st[i].rp=pr,st[i].md1=st1,st[i].md2=st2;
Left="",mid="",Right="",mid2="";
for (ll j=0;j<pl;j++) Left+=st1[j];
for (ll j=pr+1;j<st1.size();j++) Right+=st1[j];
for (ll j=pl;j<=pr;j++) mid+=st1[j];
for (ll j=pl;j<=pr;j++) mid2+=st2[j];
st[i].midd=mid,st[i].lef=Left,st[i].rig=Right;
st[i].mid1=mid2;
}
for (ll i=1;i<=q;i++){
map<str,bool>pre,suf;
cin>>st1>>st2;
if (st1.size()!=st2.size()){
cout<<"0\n";
continue;
}
ll cnt=0;
pl=0,pr=st1.size()-1;
while (st1[pl]==st2[pl]) pl++;
while (st1[pr]==st2[pr]) pr--;
Left="",mid="",Right="",mid2="";
pre[Left]=suf[Right]=1;
for (ll j=pl-1;j>=0;j--){
Left=st1[j]+Left;
pre[Left]=1;
}
for (ll j=pr+1;j<st1.size();j++){
Right+=st1[j];
suf[Right]=1;
}
for (ll j=pl;j<=pr;j++) mid+=st1[j];
for (ll j=pl;j<=pr;j++) mid2+=st2[j];
for (ll j=1;j<=n;j++){
if (mid!=st[j].midd) continue;
if (mid2!=st[j].mid1) continue;
if (pre[Left]==0) continue;
if (suf[Right]==0) continue;
cnt++;
x:
;
}
cout<<cnt<<'\n';
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...