社区讨论

trie套trie求hack

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mhiy9ep3
此快照首次捕获于
2025/11/03 17:40
4 个月前
此快照最后确认于
2025/11/03 17:40
4 个月前
查看原帖
这个东西时间最坏应该是 O(L2)O(L^2) 的,但它 AC 了,而且我也不知道怎么卡
CPP
#include<bits/stdc++.h>
using namespace std;
using H=unsigned long long;
const H B=29;
template<typename Value>
struct trie{
	struct node{
		Value v;
		node*ch[26];
		node(){v=Value();fill(ch,ch+26,nullptr);}
	}*rt;
	trie(){rt=0;}
	Value&insert(node*&u,const string&s,const int&i){
		if(!u)u=new node;
		if(s.size()==i)return u->v;
		return insert(u->ch[s[i]-'a'],s,i+1);
	}Value&insert(const string&s){return insert(rt,s,0);}
};
unordered_map<H,unordered_map<H,trie<trie<int>>>>tr;
int n,q;
string s,t;
int find1(const trie<int>&tr,const string&s){
	auto u=tr.rt;
	int ans=0;
	for(const char&c:s){
		if(!u)return ans;
		ans+=u->v;
		u=u->ch[c-'a'];
	}if(u)ans+=u->v;
	return ans;
}int find2(const trie<trie<int>>&tr,const string&s,const string&t){
	auto u=tr.rt;
	int ans=0;
	for(const char&c:s){
		if(!u)return ans;
		ans+=find1(u->v,t);
		u=u->ch[c-'a'];
	}if(u)ans+=find1(u->v,t);
	return ans;
}signed main(){
	cin>>n>>q;
	for(;n--;){
		cin>>s>>t,s=' '+s,t=' '+t;
		if(s==t)continue;
		int x=1,y=s.size()-1;
		string a,b;
		H c=0,d=0;
		for(;s[x]==t[x];++x)a+=s[x];
		for(;s[y]==t[y];--y)b+=s[y];
		for(int i=x;i<=y;++i)c=c*B+s[i]-'a'+1,d=d*B+t[i]-'a'+1;
		reverse(a.begin(),a.end());
		reverse(b.begin(),b.end());
		++tr[c][d].insert(a).insert(b);
	}for(;q--;){
		cin>>s>>t,s=' '+s,t=' '+t;
		if(s.size()!=t.size()){cout<<"0\n";continue;}
		int x=1,y=s.size()-1;
		string a,b;
		H c=0,d=0;
		for(;s[x]==t[x];++x)a+=s[x];
		for(;s[y]==t[y];--y)b+=s[y];
		for(int i=x;i<=y;++i)c=c*B+s[i]-'a'+1,d=d*B+t[i]-'a'+1;
		reverse(a.begin(),a.end());
		reverse(b.begin(),b.end());
		cout<<find2(tr[c][d],a,b)<<'\n';
	}
}

回复

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

正在加载回复...