P3065 [USACO12DEC]First! G


和之前那个题目很像

https://www.cnblogs.com/wzxbeliever/p/16087337.html

我想的是

先建立字典树 依次判断每个字符串 对于同一深度 只要满足该字符比其他字符前面就好

到这里都是没问题的 我开始想的是每层依次判断26个字母满不满足 于是开心的提交了 发现tle

于是发现了问题 每层会浪费很多比较 所以想办法改进 和上面那个题目一样 用拓扑排序

当出现环的时候 那一定是不能满足的 最后还要特判一下是否该字符串前缀为另一个字符串 如果是的话 那肯定是没法满足的

#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=3e4+5;
int n,cnt,ans;
int inn[30],sum[maxn*26],pd[maxn],tr[maxn*26][26];
string s[maxn];
vectorQ[30];
void insert(string);
void tp();
bool ck(string);
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>s[i],insert(s[i]);
	for(int i=1;i<=n;i++)
	if(ck(s[i]))ans++,pd[i]=1;
	cout<q;
void tp(){
	while(!q.empty())q.pop();
	for(int i=0;i<26;i++)
	if(!inn[i])q.push(i);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i