捞(求助关于 P4407 hash 做法)
  • 板块学术版
  • 楼主KidA
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/9 17:34
  • 上次更新2024/7/9 19:29:29
查看原帖
捞(求助关于 P4407 hash 做法)
542221
KidA楼主2024/7/9 17:34

原帖:https://www.luogu.com.cn/discuss/847496

求助大佬帮忙看下这份代码哪里错了。thx.

悬 2 关。

#include<bits/stdc++.h>
using namespace std;

const int N=5e5+5,M=31;
string s[N],ans;
int m,tot,cnt,trie[N][M];
set<int> flag[N];

bool cmp(string x,string y){
    return x.size()<y.size();
}
void insert(string ss,int f){
	int cur=0;
	for(int i=0;i<ss.size();i++){
		if(!trie[cur][ss[i]-'a'])
			trie[cur][ss[i]-'a']=++tot;
		cur=trie[cur][ss[i]-'a'];
		flag[cur].insert(f);
	}
	return;
}
string search(string ss,int p1,int p2){
	int cur=0; string t="";
	for(int i=0;i<ss.size();i++){
		cur=trie[cur][ss[i]-'a'];
		if(flag[cur].count(p1)&&flag[cur].count(p2))
			t+=(ss[i]-'a');
	}
	return t;
}

int main(){
	cin>>m;
	for(int i=1;i<=m;i++) cin>>s[i];
	sort(s+1,s+m+1,cmp);
    for(int i=1;i<=m;i++) insert(s[i],i),cout<<s[i]<<'\n';
	for(int i=1;i<=m;i++){
		if(i==1) ans+=s[i]+"P";
		else{
			string t=search(s[i],i,i-1);
			for(int j=t.size();j<s[i-1].size();j++) ans+="-";
			for(int j=t.size();j<s[i].size();j++) ans+=s[i][j];
            ans+="P";
		}
	}
	cout<<ans.size()<<'\n';
	for(int i=0;i<ans.size();i++) cout<<ans[i]<<'\n';
	return 0;
}
2024/7/9 17:34
加载中...