bzoj3012[Usaco2012 Dec]First! 一号单词

news/2024/7/23 10:11:09 标签: php, 数据结构与算法

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3012

题目大意:

给n个字符串,问如果重新定义英文字符的顺序(就是重定义字典序),有哪些单词可能排在字典的第一名
举例来说,假设有四个单词:omm,moo,mom 和ommnom,如果奶牛定义o 在m 之前,则omm 可排第一,如果定义m 在o 之前,则mom 可排第一,但余下两个单词是无论如何不可能排在第一的。


题解:

trie+拓扑

辣鸡的OxQ自以为trie+贪心能轻松一A,结果只有一半的分,啊一定是哪里又sb打错了,调调调!what???数据辣磨大???不怕!调调调!于是调了一下午QwQ讲真,眼睛都花了,感觉离近视不远了。。。当我调出来的时候。。(我真的调出来了)发现想法有bugQwQ不能贪心QwQ啊悲伤

==============正解分割线===============

按输入建trie树啦。

对于一个字符串来说,要想排第一,首先没有其他的字符串是它的前缀,那么就走一下字典树,遇到了标记的话就说明有人是它前缀,就直接判断为不可以啊。

其次的话,它字符的优先度要比和它有着相同前缀的高。也就是说,在同一个父亲下,这个儿子要比其他兄弟的优先度高。那么我们就连一条有向边,设为x->y表示x的优先度比y高。如果出现环就说明有矛盾啊,冲突了,就不可以了。

没想到每一个串的长度不超过20..以为要开三万*三十万再见

搞的我都不敢用字符数组存.输入的时候.把所有串都连到了一起,记录了每个串的长度之后,每次处理都搞什么起始位置啊烦死!输出的时候就一个一个字符输出,,慢出天际!然后我就交去bzoj上卡评测了8s多倒数第二..我简直佩服自己。讲真,知道能开三万*20之后,改了交,六百多毫秒..差得不是一点半点!瞬间Rank10...(所以拿我代码对拍的时候不要出20+的字符串 不然帮我把注释删了弄回八秒多那个 此处@GDXB

下面代码里屏蔽的就是那个八秒多的输入输出和处理,标记起始位置的那个st我还没删,感受一下我的怨念!

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 300010
#define N 30010

struct node
{
	int son[26];bool cnt;
}tr[maxn];int tlen;
int len[N];
char s[N][20];
//char s[maxn+N];
int sum,rt,rk[30];
void insert(int c,int st)
{
	int i,now=rt;
	len[c]=strlen(s[c]);
	// len[c]=strlen(s)-sum;
	for (i=0;i<len[c];i++)
	{
		int k=s[c][i]-'a';
		// int k=s[i+st]-'a';
		if (tr[now].son[k]!=0) now=tr[now].son[k];
		else {tr[now].son[k]=++tlen;now=tlen;}
	}
	tr[now].cnt=1;
}
queue<int > q;
bool v[30][30];
int ru[30],chu[30][30];//入度 出度及连出去的边
bool top()
{
	int cnt=0;
	for (int i=0;i<26;i++) if (!ru[i]) {q.push(i);cnt++;}
	while (!q.empty())
	{
		int x=q.front();q.pop();
		for (int i=1;i<=chu[x][0];i++)
		 if (ru[chu[x][i]])
		 {
			 ru[chu[x][i]]--;
			 if (!ru[chu[x][i]]) {q.push(chu[x][i]);cnt++;}
		 }
	}
	if (cnt==26) return true;
	return false;
}
bool bub(int c,int st)//走一下trie树
{
	int now=rt,i=0,j;
	for (i=0;i<len[c];i++)
	{
		int k=s[c][i]-'a';
		// int k=s[i+st]-'a';
		if (tr[now].cnt) return false;//发现有标记了
		for (j=0;j<26;j++) 
		 if (j!=k && tr[now].son[j]!=0) 
		  if (!v[k][j])
		  {v[k][j]=1;chu[k][++chu[k][0]]=j;ru[j]++;}
		now=tr[now].son[k];
	}return true;
}
bool bo[N];
int main()
{
	//freopen("first.in","r",stdin);
	//freopen("first.out","w",stdout);
	int n,i,st,cnt;
	scanf("%d",&n);
	tlen=rt=1;sum=st=0;
	for (i=1;i<=n;i++)
	{
		scanf("%s",s[i]);
                // scanf("%s",s+sum);
		insert(i,st);
		// sum+=len[i];st=sum;
	}cnt=0;//st=0;
	memset(bo,false,sizeof(bo));
	for (i=1;i<=n;i++)
	{
		memset(v,0,sizeof(v));
		memset(ru,0,sizeof(ru));
		memset(chu,0,sizeof(chu));
		if (bub(i,st))
		{
			if (top()) {cnt++;bo[i]=true;}
		}//st+=len[i];
	}//st=0;
	printf("%d\n",cnt);
	for (i=1;i<=n;i++)
	{
		if (bo[i])
		{
			printf("%s",s[i]);
			// for (int j=st;j<st+len[i];j++) 
				// printf("%c",s[j]);
			printf("\n");
		}// st+=len[i];
	}
	return 0;
}


转载于:https://www.cnblogs.com/Euryale-Rose/p/6527825.html


http://www.niftyadmin.cn/n/664527.html

相关文章

存储过程系列之存储过程sql数据库调用和程序代码调用

1、存储过程&#xff0c;无参数的存储过程 创建无参数存储存储过程 Create Procedure DCEMREMR_TEMPLATEAs SELECT TOP 10 [FILENAME],[FILETITLE],[FILECONTENT] from [DCEMR].[dbo].[EMR_TEMPLATE]; 调用无参数存储存储过程 sql 数据库中的额调用 exec DCEMREMR_TEMPLATE&am…

apache+python+mod_python+django 编译安装指南

1、本文将知道你在 linux 下使用源码包安装apache 2.2.4 python 2.5.1 mod_python 3.3.1 django svn trunk version 但是&#xff0c;因为无法得知编译过程中得到的出错信息&#xff0c;故本文默认编译过程全部顺利通过&#xff0c;任何疑问请在文后讨论区中进行。2、本文中介绍…

玛莎--JAXB的marshell

玛莎&#xff0c;安玛莎这里个方法名字好feshion,有没有玛莎拉蒂的既视感。 什么是玛 莎marshalling&#xff1f;就是序列化 &#xff0c; translating data structures or object state into a format 实现很简单&#xff0c;pojo对象加注解XmlRootElement&#xff0c;否则会…

从SEO角度出发,我们应该禁止搜索引擎对网站分页的抓取

我们采用wordpress进行网站建设的时候&#xff0c;在评论的分页的时候&#xff0c;其实是存在重复内容的&#xff0c;因为评论分页的内容正文都一样&#xff0c;并且 keywords 和 description 也相同&#xff0c;这样对搜索引擎来说&#xff0c;是不友好的&#xff0c;存在恶意…

Java虚拟机(四)垃圾收集算法

相关文章 Java虚拟机系列 前言 在本系列上一篇文章中我讲到了垃圾标记算法&#xff0c;垃圾被标记后&#xff0c;GC就会对垃圾进行收集&#xff0c;垃圾收集有很多种算法&#xff0c;这篇文章就来介绍常用的垃圾收集算法的思想。 1.标记-清除算法 标记-清除算法&#xff08;Ma…

c语言局部变量 静态局部变量 全局变量与静态全局变量

基本概念&#xff1a; 作用域&#xff1a;起作用的区域&#xff0c;也就是可以工作的范围。 代码块&#xff1a;所谓代码块&#xff0c;就是用{}括起来的一段代码。 数据段&#xff1a;数据段存的是数&#xff0c;像全局变量就是存在数据段的 代码段&#xff1a;存的是程序代码…

超可爱的文字表情大全 (ーー゛)  (--〆)zz~~~~

日系大眼睛 (ΘΘ) (Θ&#xff5e;Θ〃) (Θ&#xff4f;Θ) (ΘェΘ) (Θ∀Θ&#xff03;) (ΘдΘ&#xff1b;) (Θ皿Θメ) (ΘーΘ*) (Θ&#xff10;Θ●) (Θ▽Θ)  (ΘεΘ◎) (Θ◇Θ。) (ΘへΘ) (ΘˍΘ) (Θ、Θ) (Θ△Θ&#xff20;) (Θ&…

Maven 项目使用开源中国镜像

从maven中央库下载jar非常缓慢甚至有时候会下载不下来。 可以采用中国的maven镜像。目前主要是 开源中国的镜像。 找到maven配置文件setting.xml&#xff0c;打开 中间添加开源中国的配置&#xff1a;<!-- 开源中国 --> <mirror> <id>CN</id> <na…