链接:https://www.nowcoder.com/acm/contest/190/I
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

CSL正在学习《计算机办公自动化》文件的建立与删除。

CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office Word 文档.doc"的文件,再新建一个,则名为"新建 Microsoft Office Word 文档(2).doc",再新建,便是"新建 Microsoft Office Word 文档(3).doc"。不断新建,编号不断递增。倘若他已经新建了三个文档,然后删除了"新建 Microsoft Office Word 文档(2).doc",再新建一个就又会得到一个"新建 Microsoft Office Word 文档(2).doc"。

严格来说,Windows在每次新建文档时,都会选取一个与已有文件编号不重复的最小正整数作为新文档的编号。

现在,请你编程模拟以上过程,支持以下两种操作:

New:新建一个word文档,反馈新建的文档的编号;

Delete id:删除一个编号为id的word文档,反馈删除是否成功。

初始时一个文件都没有,"新建 Microsoft Office Word 文档.doc"的编号算作1。

输入描述

第一行一个正整数n表示操作次数,接下来n行,每行表示一个操作。若该行为"New",则表示新建,为:Delete id"则表示要删除编号为id的文档,其中id为一个正整数。操作按输入顺序依次进行。操作次数不超过100000,删除编号的数值不超过100000。

输出描述

对于输入的每一个操作,输出其反馈结果。对于新建操作,输出新建的文档的编号;对于删除操作,反馈删除是否成功:如果删除的文件存在,则删除成功,输出"Successful",否则输出"Failed"。

 

样例输入

12
New
New
New
Delete 2
New
Delete 4
Delete 3
Delete 1
New
New
New
Delete 4

样例输出

1
2
3
Successful
2
Failed
Successful
Successful
1
3
4
Successful

解题思路

直接判断就行了。

如果新建一个,遍历一遍是否有删除的,如果有,就输出该值,并去除标记,删除数减1。

如果删除一个,判断是否删除的有该文件,则标记该值,删除数加1。

#include <stdio.h>
int main()
{
    char s[10];
    int h[100010];
    int a = 1, ans = 0, i, j, t;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%s", s);
        if (s[0] == 'N')
        {
            if (!ans)
                printf("%d\n", a++);
            else
            {
                for (i = 1; i <= a; i++)
                    if (h[i])
                        break;
                ans--;
                h[i] = 0;
                printf("%d\n", i);
            }
        }
        else if (s[0] == 'D')
        {
            scanf("%d", &j);
            if (j < a)
            {
                if (h[j])
                    puts("Failed");
                else
                {
                    ans++;
                    h[j] = 1;
                    puts("Successful");
                }
            }
            else puts("Failed");
        }
    }
    return 0;
}