社区讨论

请求加强数据

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mja35ifo
此快照首次捕获于
2025/12/17 22:07
2 个月前
此快照最后确认于
2025/12/20 14:30
2 个月前
查看原帖
好奇我这样一份代码是怎么过的?(我特判s1.size()!=s2.size()continue)
通过记录
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=5e6+10;
int tr[N][30],v[N],fail[N],ts[N],cnt,ti;//ts:时间戳
int val(char c){
	if('a'<=c&&c<='z')return c-'a';
	return 26;
}
void add(string s){
	int tmp=0;
	for(auto ch:s){
		int x=val(ch);
		if(!tr[tmp][x])tr[tmp][x]=++cnt;
		tmp=tr[tmp][x];
	}
	v[tmp]++;
}
void build(){
	queue<int>q;
	while(q.size())q.pop();
	for(int i=0;i<=26;i++){
		if(tr[0][i]){
			fail[tr[0][i]]=0;
			q.push(tr[0][i]);
		}
	}
	while(q.size()){
		int u=q.front();
		q.pop();
		for(int i=0;i<=26;i++){
			if(tr[u][i]){
				fail[tr[u][i]]=tr[fail[u]][i];
				q.push(tr[u][i]);
			}
			else tr[u][i]=tr[fail[u]][i];
		}
	}
}
int qest(string s){
	ti++;
	int tmp=0,ans=0;
	for(auto ch:s){
		tmp=tr[tmp][val(ch)];
		for(int i=tmp;i&&ts[i]!=ti;i=fail[i]){
			ans+=v[i];
			ts[i]=ti;
		}
	}
	return ans;
}
int n,q;
string s1,s2,t;
string work(string &s1,string &s2){
	t="";
	int l=s1.size(),i,j=l-1;
	for(i=0;i<l;i++){
		if(s1[i]!=s2[i])break;
	}
	if(i==l)return "???";
	for(;j>=0;j--){
		if(s1[j]!=s2[j])break;
	}
	i--;
	j++;
	l=j-i-1;
	t=s1.substr(0,i+1)+"?"+s1.substr(i+1,l)+s2.substr(i+1,l)+"?"+s1.substr(j);
	return t;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>s1>>s2;
		add(work(s1,s2));
	}
	build();
	while(q--){
		cin>>s1>>s2;
		if(s1.size()!=s2.size()){
			cout<<"0\n";
		}
		cout<<qest(work(s1,s2))<<'\n';
	}
    return 0;
}

回复

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

正在加载回复...