ZOJ 3481. Expand Tab

简介:   题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4278     题意:   给出一些文本片段,把文本中的 Tab 字符根据配置,替换成一定数量的空格。

  题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4278

 

  题意:

  给出一些文本片段,把文本中的 Tab 字符根据配置,替换成一定数量的空格。

  配置分为两种,一种是只提供一个 ts 值,则需要缩进到的位置是一个等比数列。另一种是提供一个 ts 的有限集合,指定一些给定 ts 值,在逻辑上这个集合是无限的,当列位置超出集合中的数字时,后续的 tabstop 位置为连续的以 1 个空格进行递增。

  即:

  { T } 在逻辑上相当于 { T, T * 2, T * 3, T * 4, ...... };

  { T1, T2, ..., Tk } 在逻辑上相当于 { T1, T2, ..., Tk, Tk + 1, Tk + 2, Tk + 3, ...... };

 

  分析:

  本题目本身是比较简单的。但是值得注意的是:

  (1)当给定一个 ts 序列时,ts 序列的数字无序且可能重复(如果去重,可能会导致数组中只剩下一个数字,这时候不能当做等比数列来处理。如果不去重就不必在意这个问题)。所以不能假设序列有序,可以对这个序列进行一次排序。

  (2)当只提供一个 ts 值,这时为等比数列。最开始我使用了类似图像的行对齐公式来计算 stop 位置,结果这在一些情况下,结果会多考虑一个 ts 值。实际上的索引为 iCol 的列的 tabstop 值,公式仅仅是 (iCol / ts + 1) * ts 即可。由于我在这里编码心态过急,犯下这个低级失误,导致我不断的 PE N 次,差点崩溃。回到家里我慢慢查看这些步骤才找到这个错误。

 

  代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _TabStop {
    int count;
    int ts[500];
    char delimit[1024];
} TABSTOP, *LPTABSTOP;

//解析配置信息
void ParseTabStop(char *line, LPTABSTOP pTS);

//获取 tab stop 位置
int GetStopCol(int iCol, LPTABSTOP pTS);

//排序用的比较函数
int cmp(const void* p1, const void* p2);

TABSTOP g_TS;

int main() 
{
    int i, T, col, stopCol;
    char line[1024], *p;

    scanf("%ld\n", &T);
    for(i = 0; i < T; i++) {
        gets(line);
        memset(&g_TS, 0, sizeof(TABSTOP));
        ParseTabStop(line, &g_TS);

        while(true) {
            gets(line);

            if(strcmp(line, g_TS.delimit) == 0) {
                gets(line); /*case结尾的空行*/
                printf("\n");
                break;
            }

            col = 0;
            p = line;
            while(*p) {
                if(*p == '\t') {
                    stopCol = GetStopCol(col, &g_TS);
                    while(col < stopCol) {
                        printf(" ");
                        ++col;
                    }
                }
                else {
                    printf("%c", *p);
                    ++col;
                }

                ++p;
            }
            printf("\n");
        }
    }
    return 0;
}

//解析 tabstop 配置
void ParseTabStop(char *line, LPTABSTOP pTS)
{
    /*expand tab-stops-configuration <<delimiting-identifier*/

    char *p = line + 7;
    char ch;
    int index = 0;

    while(*p) {
        ch = *p; 

        if(ch >= '0' && ch <= '9')
            pTS->ts[index] = pTS->ts[index] * 10 + (*p - '0');
        else if(ch == ',')
            ++index;
        else if(ch == '<') {
            strcpy(pTS->delimit, p + 2);
            break;
        }
        ++p;
    }

    pTS->count = index + 1;
    qsort(pTS->ts, pTS->count, sizeof(int), cmp);
}

//获取当前列的 tabstop 位置
int GetStopCol(int iCol, LPTABSTOP pTS)
{
    int i;
    if(pTS->count == 1) {
        return (iCol / pTS->ts[0] + 1) * pTS->ts[0];
    }
    else {
        if(pTS->ts[pTS->count-1] <= iCol)
            return iCol + 1;

        for(i = 0; i < pTS->count; i++) {
            if(iCol < pTS->ts[i])
                return pTS->ts[i];
        }
    }
    return iCol + 1;
}

int cmp(const void* p1, const void* p2)
{
    int *pX1 = (int*)p1;
    int *pX2 = (int*)p2;
    return *pX1 - *pX2;
}
ZOJ_3481_cpp

 

  补充:

  当然,如果不对序列进行排序,也是可以的。区别只是在获取 tabstop 位置时,每次都要完整的线性遍历这个集合(在有序的情况下可以提前结束遍历,或者进一步的用二分查找快速定位),尝试找到满足条件 ts > iCol 的所有 ts 中的最小值即可。

目录
相关文章
|
8天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
7368 12
|
6天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1543 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
991 8
|
3天前
|
人工智能 JavaScript 芯片
DeepSeek 官方偷偷上传 Harness 桌面端安装包,我已经用上了。。附最新下载地址
DeepSeek Harness 官方的桌面端安装包被网友扒出来了,2 分钟讲明白如何使用,体验如何,适合作为 AI 编程工具么?附最新 Windows 和 Mac 双端的下载地址
1184 1
|
20天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
3571 10
|
14天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
1603 1
|
4天前
|
编解码 缓存 PyTorch
16G 显卡能跑 Qwen-Image 2.1 吗?
9月20日,阿里Qwen开源Qwen-Image-2.1:7B DiT图像模型+8B文本编码器+VAE,单模型支持文生图与图像编辑,原生输出2K PNG(含Alpha通道),支持10张参考图。在自建Qwen-Image-Bench达60.28分(开源模型第一),GenAI Showdown文生图排名7/15。16G显存可跑1024×1024(需INT8量化+ComfyUI优化),但2K需24G以上。注意其Qwen Research License限非商业用途。
503 1
|
5天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)

热门文章

最新文章