CH Round #57 - Story of the OI Class 查错

很明显的topo排序,字典序输出+优先队列.......

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<functional>
#include<vector>
using namespace std;
priority_queue<int, vector<int>, greater<int> >s1;
const int M=100005;
struct linklist
{
	int x;
	linklist *next;
};
linklist s[M];
int n ,m;
int a[M];
int vis[M];
int tot=0;
bool toposort()
{
	
	for (int i=1; i<=n; i++) if(!vis[i]) s1.push(i);
	if (s1.empty()) return false;
	int tj=0;
	while (!s1.empty())
	{
		int v=s1.top();
		tj++;
		vis[v]=2*n;
		a[++tot]=v;
		s1.pop();
		for (linklist *j=s[v].next; j!=NULL; j=j->next)
		{
			int t=j->x;
			vis[t]--;
			if (!vis[t]) s1.push(t);
		}
	}
	if (tj<n) return false;
	else return true;
}
void insert(linklist &x, int y)
{
	linklist *t;
	t=new(linklist);
	t->x=y;
	t->next=x.next;
	x.next=t;
}
void init()
{
	scanf("%d %d", &n, &m);
	for (int i=1; i<=n; i++)
	{
		s[i].x=i;
		s[i].next=NULL;
	}
	for (int i=1; i<=m; i++)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		insert(s[x], y);
		vis[y]++;
	}
}
int main()
{
	init();
	if (!toposort()) printf("OMG.\n");
	else {
		for (int i=1; i<=tot; i++)
		{
			printf("%d ", a[i]);
		}
	}
	return 0;
}


grep &#39;PT-SH-OC-OI083217&#39; -Rn grep &#39;ST-GM-QRY-1002&#39; -Rn grep &#39;PT-SH-FS-OI2238&#39; -Rn grep &#39;ST-GM-QRY-1003&#39; -Rn grep &#39;ST-GM-SC-1005&#39; -Rn grep &#39;ST-GM-SC-1006&#39; -Rn grep &#39;PT-SH-RB-OI000002&#39; -Rn grep &#39;PT-SH-FS-OI002113&#39; -Rn grep &#39;PT-SH-OC-OI069633&#39; -Rn grep &#39;PT-SH-OC-OI073440&#39; -Rn grep &#39;PT-SH-OC-OI076449&#39; -Rn grep &#39;PT-SH-OC-OI071017&#39; -Rn grep &#39;PT-SH-OC-OI069229&#39; -Rn grep &#39;PT-SH-OC-OI073430&#39; -Rn grep &#39;ST-GM-SC-001&#39; -Rn grep &#39;PT-SH-OC-OI074642&#39; -Rn grep &#39;ST-GM-1002&#39; -Rn grep &#39;PT-SH-OC-OI074820&#39; -Rn grep &#39;PT-SH-OC-OI073422&#39; -Rn grep &#39;PT-SH-OC-OI073426&#39; -Rn grep &#39;PT-SH-OC-OI073427&#39; -Rn grep &#39;PT-SH-OC-OI001355&#39; -Rn grep &#39;PT-SH-OC-OI001080&#39; -Rn grep &#39;PT-SH-OC-OI001408&#39; -Rn grep &#39;PT-SH-FS-OI819561&#39; -Rn grep &#39;PT-SH-OC-OI070624&#39; -Rn grep &#39;PT-SH-BMG-OI0129&#39; -Rn grep &#39;PT-SH-OC-OI060800&#39; -Rn grep &#39;PT-SH-OC-OI060814&#39; -Rn grep &#39;PT-SH-OC-OI069234&#39; -Rn grep &#39;PT-SH-OC-OI068448&#39; -Rn grep &#39;PT-SH-OC-OI001325&#39; -Rn grep &#39;PT-SH-OC-OI073421&#39; -Rn grep &#39;PT-SH-OC-OI073435&#39; -Rn grep &#39;PT-SH-OC-OI073439&#39; -Rn grep &#39;PT-SH-OC-OI073224&#39; -Rn grep &#39;PT-SH-OC-OI073437&#39; -Rn grep &#39;PT-SH-OC-OI060802&#39; -Rn grep &#39;PT-SH-OC-OI073418&#39; -Rn grep &#39;PT-SH-OC-OI001469&#39; -Rn grep &#39;PT-SH-OC-OI001726&#39; -Rn grep &#39;PT-SH-OC-OI091417&#39; -Rn grep &#39;PT-SH-OC-OI3815&#39; -Rn grep &#39;PT-SH-OC-OI2269&#39; -Rn grep &#39;PT-SH-OC-OI2270&#39; -Rn grep &#39;PT-SH-OC-OI073425&#39; -Rn grep &#39;PT-SH-OC-OI073423&#39; -Rn grep &#39;PT-SH-OC-OI073424&#39; -Rn grep &#39;PT-SH-OC-OI069639&#39; -Rn grep &#39;PT-SH-OC-OI073436&#39; -Rn grep &#39;PT-SH-OC-OI070230&#39; -Rn
08-30
<think> 我们之前讨论了用户脚本中出现的语法错误(未闭合的单引号导致文件结束符错误),现在用户提供了新的引用,并希望了解grep命令在脚本中的使用情况、可能的问题及解决方案。结合用户之前遇到的语法错误,我们需要重点关注grep命令中引号使用不当可能导致的类似错误。 用户引用信息分析: 引用[1]:展示了split_tags函数与grep的管道使用,重点在引号内使用特殊字符(`<`)和变量传递。 引用[2]:说明grep的静默模式替代方案(重定向到/dev/null),并涉及输出重定向的语法(2>&1)。 引用[3]:列出Linux常用命令,与grep直接相关的是rpm查询命令,但可忽略。 用户需求:解决脚本中使用grep命令时出现的问题(尤其是引号错误和文件结尾错误)。 解决方案设计: 1. 分析grep命令中引号使用场景(单引号、双引号、无引号)及其与之前语法错误的关系。 2. 针对用户之前遇到的“未预期文件结束符”错误,重点检查grep模式字符串中的引号闭合问题。 3. 提供grep常见问题及解决方法,包括特殊字符处理、模式字符串跨行问题、引号嵌套等。 4. 结合错误案例给出修复示例。 具体回答结构: ### 解决Shell脚本中grep命令的引号错误 - 分析错误原因(引号不闭合如何影响整个脚本) - 常见问题场景及解决方案(含代码示例) - 调试技巧 ### 相关问题列表 生成3个相关问题 </think> ### 解决Shell脚本中grep命令的引号错误与文件结尾问题 在脚本中使用`grep`命令时(如`grep &#39;PT - SH - OC - OI083217&#39; -Rn`),若引号使用不当会导致两类关键错误: 1. **未闭合引号错误**(寻找匹配的“&#39;”时遇到未预期的文件结束符) 2. **文件结尾语法错误**(未预期的文件结尾) 这些问题通常由以下场景引发: #### 一、常见错误场景及解决方案 1. **模式字符串包含未转义的特殊字符** - **问题**:当搜索模式包含`$`、`!`或`&#39;`时,未转义会破坏引号结构 ```bash # 错误示例($未转义) grep &#39;Version: $5.0&#39; file.txt # $会被解释为变量 ``` - **修复方案**: - 使用单引号包裹整个模式并转义内部单引号 ```bash grep &#39;PT - SH - OC - OI083217&#39;\&#39;&#39;s log&#39; -Rn # 用&#39;\&#39;&#39;转义单引号 ``` - 或改用双引号但转义特殊字符 ```bash grep "PT - SH - OC - OI083217\&#39;s log" -Rn # 双引号内用\&#39;转义 ``` 2. **跨行模式字符串未正确处理** - **问题**:长模式跨行书写时意外断开引号 ```bash # 错误示例(行尾\后多空格) grep &#39;PT - SH - OC \ - OI083217&#39; -Rn # \后空格导致换行符未被转义 ``` - **修复方案**: - 使用`$&#39;...&#39;`格式支持转义换行符 ```bash grep $&#39;PT - SH - OC\n- OI083217&#39; -Rn # \n显式表示换行 ``` - 或用变量保存模式 ```bash pattern="PT - SH - OC - OI083217" grep "$pattern" -Rn ``` 3. **管道操作中grep输出未过滤** - **问题**:未处理空输出导致后续命令语法错误 ```bash # 错误示例(grep无匹配时rm收到空参数) grep "temp_file" *.log | xargs rm ``` - **修复方案**: - 通过重定向屏蔽错误(引用[2]方法) ```bash grep "louise" /etc/passwd > /dev/null 2>&1 && echo "Found" ``` - 或用`-q`抑制输出 ```bash if grep -q "critical_error" system.log; then alert_admin # 仅检查存在性[^1] fi ``` #### 二、调试技巧与预防措施 1. **语法验证工具** ```bash bash -n script.sh # 检查语法错误 shellcheck script.sh # 静态分析工具 ``` 2. **分阶段执行** ```bash # 先单独测试grep命令 pattern=&#39;PT - SH - OC - OI083217&#39; grep "$pattern" -Rn /target_dir > result.tmp ``` 3. **引号使用规范** | 场景 | 推荐方案 | 示例 | |---------------------|-------------------|--------------------------| | 含变量 | 双引号 | `grep "$var" file` | | 含特殊字符 | 单引号+转义 | `grep &#39;!\$#&#39; file` | | 跨行长字符串 | 引号外拼接 | `&#39;part1&#39;"part2"` | > **关键原则**:当模式字符串包含连字符(`-`)、空格或斜杠时,必须用引号包裹整个模式,否则会被解析为命令选项或分隔符(如`PT`被误认为选项)[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值