社区讨论

求助样例均过but5pts

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mjbj0e8m
此快照首次捕获于
2025/12/18 22:18
3 个月前
此快照最后确认于
2025/12/20 21:40
3 个月前
查看原帖
哪位大佬帮忙改进一下算法
别告诉我AC自动机解
CPP
#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 条回复,欢迎继续交流。

正在加载回复...