首页 > 其他分享 >单词游戏 欧拉回路

单词游戏 欧拉回路

时间:2024-08-21 16:52:09浏览次数:5  
标签:scnt din dout idx int 单词 ++ 回路 欧拉

// 单词游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1528

https://loj.ac/p/10106
来自 ICPC CERC 1999/2000,有改动。

有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,
前一个盘子上单词的末字母等于后一个盘子上单词的首字母。请你编写一个程序,判断是否能达到这一要求。如果能,请给出一个合适的顺序。

【输入】
多组数据。第一行给出数据组数 T,每组数据第一行给出盘子数量 N,接下去 N 行给出小写字母字符串,一种字符串可能出现多次。

【输出】
若存在一组合法解输出Orderingispossible.,否则输出Thedoorcannotbeopened.。

【输入样例】
3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok
【输出样例】
The door cannot be opened.
Ordering is possible.
The door cannot be opened.
【提示】
数据范围与提示

1≤N≤105,∣S∣≤1000
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <string>
#include <unordered_map>


using namespace std;



const int N = 1010, M = 400010;
int h[N], e[M], ne[M], idx;
int t, n;
int din[N],dout[N]; int cnt;
int used[M];
int ans[M];
unordered_map<int, string> mm;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int u) {
	for (int& i = h[u]; i != -1; ) {

		int j = e[i];
		i = ne[i];
		dfs(j);

		ans[cnt++] = u;
	}
}

int main() {
	cin >> t;
	while (t--) {
		memset(h, -1, sizeof h);
		memset(din, 0, sizeof din);
		memset(dout, 0, sizeof dout);
		memset(used, 0, sizeof used);
		idx = 0; cnt = 0;

		cin >> n;
		int start = 0;
		for (int i = 0; i < n; i++) {
			string str; cin >> str;
			int a = str.front() - 'a'; int b = str.back() - 'a';
			add(a, b); 
			
			dout[a]++; din[b]++; start = a; 
		}
		
		int scnt = 0; int ecnt = 0;
		for (int i = 0; i < 26; i++) {
			if (din[i] != dout[i]) {
				if (dout[i] == din[i] + 1) { scnt++; start = i;}
				else if (din[i] == dout[i] + 1) { ecnt++;  }
				else {
					scnt = 999;
				}
			}
		}

		if ( (scnt != 1 || ecnt != 1) && (scnt!=0||ecnt!=0)) {
			cout << "The door cannot be opened." << endl;
			continue;
		}
		

		dfs(start);

		if (cnt == n) {
			cout << "Ordering is possible." << endl;
		}
		else {
			cout << "The door cannot be opened." << endl;
		}
		
	}


	return 0;
}

标签:scnt,din,dout,idx,int,单词,++,回路,欧拉
From: https://www.cnblogs.com/itdef/p/18371994

相关文章

  • 欧拉回路 模版dfs stack两种版本
    stack堆栈代替dfs版本//欧拉模版.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///**https://loj.ac/p/10105有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。一共两个子任务:这张图是无向图。(50分......
  • 找两个单词规律-哈希表
     力扣的简单题目,来找单词的规律,下面我们用python的dict来解决,思路:同时遍历pattern和s,因为s是用空格进行分割的,因此用python的split()函数进行拆分即可。Step1:统计pattern和s的长度是否一致,不一致返回FalseStep2:遍历pattern和sStep3:构建p_dict和s_dict用于编码,......
  • 力扣面试经典算法150题:最后一个单词的长度
    最后一个单词的长度今天的题目是力扣面试经典150题中的数组的简单题:最后一个单词的长度题目链接:https://leetcode.cn/problems/length-of-last-word/description/?envType=study-plan-v2&envId=top-interview-150题目描述给定一个仅包含大小写字母和空格’’的字符......
  • Python编程常用英文单词大全!收藏别忘了!
      Python编程中常用的英文单词非常丰富,这些单词涵盖了编程的各个方面,包括基础概念、数据类型、控制结构、函数与模块、类与对象、异常处理等。以下是一些常用的英文单词及其简要说明:1.基础概念Variable(变量):用来存储和表示数据的容器。Function(函数):一段可重复使用的代码......
  • 代码随想录算法训练营day09|151.翻转字符串里的单词,卡码网:55.右旋转字符串,28.实现 str
    151.翻转字符串里的单词题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/暴力removeExtraSpaces:voidremoveExtraSpaces(string&s){for(inti=s.size()-1;i>0;i--){if(s[i]==''&&s[i]=......
  • 【运筹学】链、路、圈、回路、树与生成树(图与网络相关概念)
    1 链、路、圈、回路1.1链和路的概念、区别、关系    链是连接两个节点的一序列边或弧;    路是连接两个节点的同一方向上的一序列边或弧;    区别:链和路的区别仅在于链是无方向限制的,路是同一方向的;    关系:①路是沿前进方向连接所有弧的......
  • LongWriter: 基于LLM代理可以将输出窗口大小扩展到10,000+个单词
    LLM可以处理长达100,000个token的输入,但在生成超过2,000词的适度长度输出时仍然面临困难,因为模型的有效生成长度本质上受到其在监督微调(SFT)过程中所见样本的限制。为解决这个问题,本文的作者引入了AgentWrite,这是一个基于代理的流程,它将超长生成任务分解为子任务,使现成的L......
  • 单词
    考虑暴力怎么做。一个很自然的想法就是枚举每个模式串,并将当前枚举到的模式串作为文本串,然后内层循环再依次枚举模式串,看每个模式串在文本串中出现了多少次发现上述过程与AC自动机的匹配很像,于是建立AC自动机,将每个串都放在AC自动机上跑query,当前跑到的u就代表这个串的一个前缀,然......
  • 204 汉密尔顿回路
    //204汉密尔顿回路.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/14/problem/632给你一张无向简单图,请问能否从指定起点出发找到一条汉密尔顿回路。输入格式第一行两个整数n,m,表示图的顶点数和边数,顶点编号从1到......
  • 编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查
    /编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查找树存储单词及其出现的次数。程序在读入文件后会提供一个有三个选项菜单。第一个选项是列出所有的单词和出现的次数。第二个选项是让用户输入一个单词,程序报告该单词在文件中出现的次数。......