专栏文章

P13499:「Cfz Round 6」Umiyuri Kaiteitan

P13499题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miop78sc
此快照首次捕获于
2025/12/02 22:53
3 个月前
此快照最后确认于
2025/12/02 22:53
3 个月前
查看原文

题目传送门

题目大意

当收到 ls > NAME 指令时,执行以下操作:
  • 若在当前目录中不存在名为 NAME 的文件,则创建一个名为 NAME 的文件;若在当前目录中存在名为 NAME 的文件,则将该文件的内容清空;
  • 将当前目录中所有文件的文件名按照递增的顺序写入到名为 NAME 的文件中,相邻两个文件名之间用一个空格分隔。

思路

前置工作

我们要定义两个数组——数组 aa 和数组 hhaxa_x 表示文件名为 xx 的文件的大小,hxh_x 表示文件名为 xx 的文件是否出现过。
另外,我们还要定义一个变量 sumsum,用来记录前几个文件的文件名的总字节数(包含空格)。

解题

对于每个指令,都有以下步骤:
如果文件名为 xx 的文件没有出现过(不然会重复计算),那么现在要使用 sumsum 累加文件名的字节数 +1+1(因为还有空格)。
tips:计算文件名的字节数需要用函数。
如果文件名为 xx 的文件出现过了,此时将文件名为 xx 的文件清空,即 ax=0a_x=0
axa_x 赋值为 sum1sum-1(为什么还要 1-1 呢?因为在计算每个文件名的字节时包含了空格,但在算最后一个文件名的字节时会多加一个空格,所以要减掉)。
标记文件名为 xx 的文件出现过,即 hx=1h_x=1

AC Code:

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
bool h[N];
// vector<int> v[N];
long long a[N];
int cal(int x)
{
    int cnt=0;
    while(x)
    {
        x/=10;
        cnt++;
    }
    return cnt+1;
}
int main()
{
    int n,m;
    cin >>n>>m;
    long long sum=0;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >>x;
        if(h[x]==0) sum+=cal(x);
        if(h[x]==1) a[x]=0;
        a[x]=sum-1;
        h[x]=1;
    }
    for(int i=1;i<=m;i++) cout <<a[i]<<" ";
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...