WA56pts求hack
查看原帖
WA56pts求hack
535996
DYhzx_QWQ楼主2025/8/1 09:45

过了 #1,2,3,5 求hack做法or调

简单来说就是按长度排序后找前面能接上的就接上去

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define _ 500005
ll n,ans[_],tot;
string a[_];
bool cmp(string a,string b) {
	if(a.size()!=b.size()) return a.size()<b.size();
	else return a<b;
}
struct trie {
	ll tt;
	struct point {ll son[27],bj;} tr[_*6];
	ll getnum(char x) {return x-'a';}
	void add(string a,ll k) {
		ll x=0,siz=a.size();
		for(ll i=0;i<siz;i++) {
			ll op=getnum(a[i]);
			if(!tr[x].son[op]) tr[x].son[op]=++tt;
			x=tr[x].son[op];
		}
		tr[x].bj=k;
	}
	ll find(string a) {
		ll x=0,siz=a.size(),s=0,k=0;
		for(ll i=0;i<siz-1;i++) {
			ll op=getnum(a[i]);
			if(!tr[x].son[op]) return 0;
			x=tr[x].son[op];
		}
		s=max(s,ans[tr[x].bj]),k=tr[x].bj;
		for(ll i=0;i<26;i++) {
			if(ans[tr[tr[x].son[i]].bj]>s) k=tr[tr[x].son[i]].bj,s=ans[tr[tr[x].son[i]].bj];
		}
		return k;
	}
}tr;
int main() {
	// ios::sync_with_stdio(0);
	// cin.tie(0),cout.tie(0);
	cin>>n;
	for(ll i=1;i<=n;i++) cin>>a[i],reverse(a[i].begin(),a[i].end());
	sort(a+1,a+n+1,cmp);
	ll s=0;
	for(ll i=1;i<=n;i++) {
		ll op=tr.find(a[i]);
//        cout<<ans[op]+1<<' '<<a[i]<<endl;
		s=max(s,ans[op]+1);
		if(op==0) tr.add(a[i],++tot),ans[tot]=1;
		else tr.add(a[i],op),ans[op]++;
	}
	cout<<s;
	return 0;
} 
/*
4
abc
bc
dc
bdc
*/

QWQ

2025/8/1 09:45
加载中...