玄关求调
查看原帖
玄关求调
744251
concert_B楼主2024/3/31 17:36

WA6T3,只对第一个点。用的是字典树排序。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
vector<int> v[N];
int ed[N];
int tr[N][65],tot=0;
int n;
char c[N];
pair<int,int> a[N],dp[N];
int cnt=1;
vector<string> w;
int b[N];
int change(char c){
	if('a'<=c&&c<='z')	return c-'a';
	if('A'<=c&&c<='Z')	return c-'A'+26;
}
void insert(string s,int t){
	int l=s.size(),p=0;
	for(int i=0;i<l;i++){
		int c=change(s[i]);
		if(!tr[p][c])
			tr[p][c]=++tot;
		p=tr[p][c];
	}
	ed[p]++;
	v[p].push_back(t);
	return;
} 
int csort(int p,int res){
	if(ed[p]){
		int q;
		for(int i=0;i<v[p].size();i++)
			a[v[p][i]].first=res,q++,a[v[p][i]].second=v[p][i];
		res+=q;
	}
	for(int i=0;i<52;i++){
		if(!tr[p][i])	continue;
		res=csort(tr[p][i],res);
	}
	return res;
}
signed main(){
	cin>>c;
	w.push_back("");
	for(int i=0;i<strlen(c);){
		int l=0;
		string s;
		s+=c[i++];
		while(c[i]>='a'&&c[i]<='z')
			s+=c[i++];
		insert(s,++n);
		w.push_back(s);
	}
	csort(0,1);
	dp[1]=a[1];
	for(int i=2;i<=n;i++){
		if(a[i].first>dp[cnt].first){
			dp[++cnt]=a[i];
		}
		else{
			dp[lower_bound(dp+1,dp+cnt+1,a[i])-dp]=a[i];
		}
	}
	for(int i=1;i<=cnt;i++)
		cout<<w[dp[i].second];
	return 0;
}

2024/3/31 17:36
加载中...