关闭

uva 502 DEL command

标签: 遍历指针字符串
990人阅读 评论(0) 收藏 举报
分类:

题目地址:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=443

题目描述:



  DEL command 

It is required to find out whether it is possible to delete given files from MS-DOS directory executing the DEL command of MS-DOS operation system only once. There are no nested subdirectories.

A note 

DEL command has the following format: DEL wildcard


The actual wildcard as well as a full file name can be made up either of a name containing 1 up to 8 characters or of a name and extension, containing up to 3 characters. The point character ``." separates the extension from the file name. The extension can be empty and this is equivalent to a name without any extension (in this case a wildcard ends with a point). In a wildcard the characters ``?" and ``*" can be used. A question mark substitutes exactly one character of the full file name excluding a point, an asterisk any sequence of characters (containing no points) even empty one. An asterisk can appear only at the last position of the name and the extension.


MS-DOS system can permit maybe other wildcards but they can not be used in this task. File names and extensions consist only of Latin capitals and digits.

Input 

The first line of the input is an integer M, then a blank line followed by M datasets. There is a blank line between datasets.

Input data for each dataset contains a list of full file names without empty lines and spaces. Each name is written in a separate line of input data file and preceded with a control sign: ``-" for delete or ``+" for keep. Full file names are not repeated. The list comprises at least one file, and at least one file is marked to be deleted. There are no more than 1000 files.

Output 

For each dataset, write to the first line of output the required DEL command (only one proposal) orIMPOSSIBLE if there is no solution. A space should separate ``DEL" from wildcard. Print a blank line between datasets.

Sample Input 

1

-BP.EXE
-BPC.EXE
+TURBO.EXE

Possible output 

DEL ?P*.*
题意:

构造一个严格过滤串,将含有+号的串过滤掉,而含有-号的串留在这里,表示要删除的文件清单。

题解:

字符串处理。

这题的思路我并没有用到DFS,因为对数据的模拟发现,如果在输入要删除的文件当中,构造一个最严格的过滤串,只要在输入不要删除的文件中过滤串都能过滤掉这些不删除的文件则表示有解,而只要有一个不需要删除的文件没有被过滤串过滤掉 则表示整个情况是impossible的。

这样我们可以把输入要删除文件分一堆,不删除文件分一堆。先遍历要删除文件,从而构造一个最严格过滤串(这样就不用回溯多次构造过滤串),然后用获得的过滤串去遍历不删除的文件,只要全部过滤掉,这输出这个过滤串,反之 只要有一个 没有被过滤掉直接退出遍历,输出impossible。

关于过滤串的构造:1、对应位字符相等,则过滤串对应位为该字符。2、对应位字符串不等,则过滤串该位为 '?'。3、对应串不等,但是出现在末端,比如其中一个串到达了'.'位置或者是‘\0’位置,则过滤串对应位为‘*’。

注意:字符串模拟要小心,特别是指针的移动细节,比较字符,跳转等等。总之就是要模拟就必须要非常细心。

剪枝:当不删除文件数量为0时,则表示输入的文件全部删除,没必要去生成最严格过滤串,直接输出 DEL *.* 即可。

两次WA的原因:

第一次:在处理过滤串过滤不删除文件的遍历过程中,到达'.'后 退出循环,没有考虑可能是这样的情况 过滤串指针指向'*'位置 而它的后一位就是'.'位置了 而不删除文件指针指向了'.'导致循环提早跳出,然后直接判断不等得出相关结论。实际上 '*'与'.'是符合相容情况的如何 A*. 与A.  是可以相容的 并不排斥。

第二次:过滤串是要检查所有的不删除文件们后  这些都能过滤才能得出结论 说明 过滤串是有效的,而自己仅在判断一个不删除文件的过程中,直接用return 提前结束了不删除文件的遍历。这样并不能保证所有的不删除文件都能过滤。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
#include <algorithm>
using namespace std;
char substr[1000+5][15+5]={'\0'};
int subcnt=0;
char addstr[1000+5][15+5]={'\0'};
int addcnt=0;
int M=0;
char delstr[15+5]={'\0'};//delete string
char instr[15+5]={'\0'};//input string
/*struct the delstr*/
int FindDelStr()
{
	char prestr[15]={'\0'};//compare string
	char rearstr[15]={'\0'};
	int i1=0,i2=0,j=0,k=0;
	if(subcnt>=1)
	{
		strcpy(prestr,substr[0]);
		strcpy(delstr,prestr);
	}
	for(k=1;k<=subcnt-1;k++)
	{
		strcpy(rearstr,substr[k]);
		//get the delstr pattern
		i1=0;
		i2=0;
		j=0;
		while(prestr[i1]!='.'&&rearstr[i2]!='.')//~~~~~.  left of the '.'
		{
			if(prestr[i1]==rearstr[i2])
			{
				delstr[j]=prestr[i1];
			}
			else
			{
				if(prestr[i1]=='*')
				{
					//let the i2 point the left 1 bit of the '.'
					while(rearstr[i2]!='.')
					{
						i2++;
					}
					i2--;//point the left 1 bit of the '.'
					delstr[j]='*';
				}
				else
				{
					delstr[j]='?';
				}
			}
			i1++;
			i2++;
			j++;
		}
		if(prestr[i1]==rearstr[i2])//=='.' besides  i1==i2
		{
			delstr[j]='.';
			j++;
		}
		else
		{
			delstr[j]='*';
			j++;
			delstr[j]='.';
			j++;
		}
		while(prestr[i1]!='.')
		{
			i1++;
		}
		i1++;//i1 point the . right
		while(rearstr[i2]!='.')
		{
			i2++;
		}
		i2++;//i2 point the . right

		while(prestr[i1]!='\0'&&rearstr[i2]!='\0')//~~~~~.  left of the '.'
		{
			if(prestr[i1]==rearstr[i2])
			{
				delstr[j]=prestr[i1];
			}
			else
			{
				if(prestr[i1]=='*')
				{
					//let the i2 point the left 1 bit of the '\0'
					while(rearstr[i2]!='\0')
					{
						i2++;
					}
					i2--;//point the left 1 bit of the '\0'
					delstr[j]='*';
				}
				else
				{
					delstr[j]='?';
				}
			}
			i1++;
			i2++;
			j++;
		}
		if(prestr[i1]==rearstr[i2])//=='.' besides  i1==i2
		{
			delstr[j]='\0';
			j++;
		}
		else
		{
			delstr[j]='*';
			j++;
			delstr[j]='\0';
			j++;
		}
		strcpy(prestr,delstr);//next update the delstr
	}
	return(0);
}
/*test the delstr whether can test the no del string*/
bool TestNoDelStr()
{
	if(addcnt==0)
	{
		strcpy(delstr,"*.*");
		return(true);
	}
	int i=0,j=0,k=0;
	int flag=0;//flag=1 indicate it is match for the delstr
	for(k=0;k<=addcnt-1;k++)
	{
		i=0;
		j=0;
		flag=1;
		while(delstr[i]!='.'&&addstr[k][j]!='.')
		{
			if(delstr[i]!=addstr[k][j])
			{
				if(delstr[i]=='?')
				{

				}
				else if(delstr[i]=='*')
				{
					while(addstr[k][j]!='.')//let the point the '.' left one bit
					{
						j++;
					}
					j--;
				}
				else
				{
					flag=0;
					//return(true);
				}
			}
			i++;
			j++;
		}
		if(delstr[i]=='*')
		{
			while(addstr[k][j]!='.')//let the point the '.' left one bit
			{
				j++;
			}
			j--;
			i++;
			j++;
		}
		if(delstr[i]!=addstr[k][j])//must reach '.' at the same times
		{
			flag=0;
			//return(true);
		}
		i++;
		j++;//point the . right
		while(delstr[i]!='\0'&&addstr[k][j]!='\0')
		{
			if(delstr[i]!=addstr[k][j])
			{
				if(delstr[i]=='?')
				{

				}
				else if(delstr[i]=='*')
				{
					while(addstr[k][j]!='\0')//let the point the '.' left one bit
					{
						j++;
					}
					j--;
				}
				else
				{
					flag=0;
					//return(true);
				}
			}
			i++;
			j++;
		}
		if(delstr[i]=='*')
		{
			while(addstr[k][j]!='\0')//let the point the '.' left one bit
			{
				j++;
			}
			j--;
			i++;
			j++;
		}
		if(delstr[i]!=addstr[k][j])//must reach '\0' at the same times
		{
			flag=0;
			//return(true);
		}
		if(flag)
		{
			return(false);
		}
	}
	return(true);//the delstr match the all addstr then return false that this delstr is invalid
}
/*for test*/
int test()
{
	return(0);
}
/*main process*/
int MainProc()
{
	scanf("%d",&M);
	getchar();//eat the \n
	getchar();
	while(M--)
	{
		//init
		subcnt=0;
		addcnt=0;
		memset(delstr,'\0',sizeof(delstr));
		while(fgets(instr,15,stdin)!=NULL&&instr[0]!='\n')//not the EOF,EOF is int type
		{
			int inlen=strlen(instr);
			instr[inlen-1]='\0';//cover the \n
			inlen--;
			if(strchr(instr,'.')==NULL)
			{
				instr[inlen]='.';
				instr[inlen+1]='\0';
				inlen++;
			}
			if(instr[0]=='-')//- delete string
			{
				strcpy(substr[subcnt],instr+1);//abandon the + or -
				subcnt++;
			}
			else//+ do not delete string
			{
				strcpy(addstr[addcnt],instr+1);
				addcnt++;
			}
		}
		//test
		int i=0;
		if(addcnt>0)
		FindDelStr();//if addcnt==0  we can del *.*
		if(TestNoDelStr())//the delstr is valid
		{
			printf("DEL %s\n",delstr );
		}
		else//impossible
		{
			printf("IMPOSSIBLE\n");
		}
		//blank line between datasets
		if(M>0)
		{
			printf("\n");
		}
	}
	return(0);
}
int main(int argc, char const *argv[])
{
	/* code */
	MainProc();
	return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

uva 502 DEL command(字符串处理)

DEL command  It is required to find out whether it is possible to delete given files from MS-DOS directory executing the DEL command of MS...
  • u011328934
  • u011328934
  • 2013-08-11 10:24
  • 989

经验之谈:nginx php 502 bad gateway 解决方法

今天在使用nginx时发现运行php页面会提示502 bad gateway这类错误了,下面我根据各位群友提供的一些方法完美的解决了502 bad gateway问题。 访问phpMyAdmin时,出现下面错误。 phpMyAdmin – Error Cannot start ...
  • u010412301
  • u010412301
  • 2016-10-13 17:15
  • 3755

xhprof 安装与使用

xhprof 是一款Facebook工程师开发和维护的一款PHP性能分析、调试工具,相较于xdebug要更轻量,更节省资源,强烈推荐大家使用。 1、安装流程 可以使用pecl安装、源码编译,如果网络状况支持pecl安装就用pecl安装吧,这是最简便的安装方法。 (1)  通过pecl安装 ...
  • zhqagp
  • zhqagp
  • 2016-05-25 17:56
  • 1633

nginx 502出错集锦

Nginx出现502 Bad Gateway 错误, 查了Nginx的错误日志为: [html] view plain copy 2014/08/02 16:14:31 [error] 17029#0: *17941 recv()&...
  • u010391029
  • u010391029
  • 2016-04-21 17:58
  • 2727

nginx页面加载不全或提示502bad gateway,nginx反向代理端口号丢失

Nginx反向代理模式下出现页面加载不全,或直接出现502 bad gateway的情况。 出现502 bad gateway的情况有很多,大多是一些nginx相关timeout的设置问题。下文讨论一种比较少见但又不得不注意的情况。出现环境nginx工作在反向代理模式下,监听非80端口(这点很重要,...
  • wh1511995112
  • wh1511995112
  • 2016-04-12 13:48
  • 5452

状态码502和504分析

转自:http://www.ttlsa.com/html/3112.html 一. 戏说 不管你是做运维还是做开发,哪怕你是游客,时不时会遇到502 Bad Gateway或504 Gateway Time-out。出现这页面,把服务重启下,再实在不行重启下服务器,问题就解决了,但是,这问题还是...
  • qq_24802115
  • qq_24802115
  • 2016-12-27 19:57
  • 878

db2数据迁移del,ixf

db2数据迁移del,ixf 在用`db2 import from test.del of del insert into table`导入数据的时候,报错说有几条数据导入失败,但是导出的数据条数和导入的数据条数都与数据库中的数据条数是相等的,很奇怪,后来发现del文件是按行来存储数据的,因为在...
  • iamiwangbo
  • iamiwangbo
  • 2015-08-04 16:46
  • 2482

我所遇到的GitLab 502问题的解决

今天在阿里云上配置GitLab,不过一直出现错误502错误。 502  GitLab is not responding.  Please contact your GitLab administrator if this problem persists. ...
  • RodJohnsonDoctor
  • RodJohnsonDoctor
  • 2015-05-09 22:22
  • 31553

ftp通信时的指令

 今天在一个国外网站看到了ftp通信时的指令,将它贴在这里: FTP Commands This document describes all the FTP commands implemented. ABOR Aborts the previous FTP servic...
  • gerryzhu
  • gerryzhu
  • 2014-10-28 17:40
  • 8075

我所遇到的GitLab 502问题的解决

今天在阿里云上配置GitLab,不过一直出现错误502错误。 502 GitLab is not responding. Please contact your GitLab administrator if this problem persists. ...
  • wangxicoding
  • wangxicoding
  • 2015-02-11 20:17
  • 18936
    个人资料
    • 访问:545773次
    • 积分:5920
    • 等级:
    • 排名:第5022名
    • 原创:145篇
    • 转载:54篇
    • 译文:0篇
    • 评论:98条
    最新评论