[ZOJ 1116 ] [ POJ 1911 ] A Well-Formed Problem

『杭电1377』A Well-Formed Problem Problem Description XML, eXtensible Markup Language, is poised to become the lingua franca of structured data communication for the foreseeable future, due in part to its strict formatting requirements. XML parsers must report anything that violates the 阅读详情

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1116

题目大意:

(对XML没有了解,只是按照字面意思理解了一下题意)

<name>与</name>这样有起始结束声明的,name称为tag

<order/>是empty element, 不需要end-tag

第一行<?xml version="1.0"?>不算文档的element

<zip-code format="PLUS4">10001-0001</zip-code>这里的format是zip-code的属性

一个well-formed document要满足下面几条:

1、只有一个element不嵌套在别的element里,例如例子中的"customer" 
2、嵌套正确,不是<order/>那样的,如<name>与</name>要完整配对嵌套
3、如<name>与</name>这样的声明名字要配对
4、一个tag最多一个属性
5、不递归调用,如address element里不能调用address
6、有名字的属性,比如上面的format,要有对应的值

注意大小写不同,如<Address>和<address>应该认为是不同的



输入:

每组数据第一行是 "<?xml version="1.0"?>"。

"<?end?>" 表示全部输入的结束(只是在本题中用来标记输入结束)

输入保证:

 "<?xml version="1.0"?>"会且仅会在第一行出现

element和属性只用数字、字母和短线"-"表示

XML注释不出现

属性的值一定会放在“”里



输出

"well-formed"或者"non well-formed"



解题思路:

字符串处理,主要用到栈和集合。

每次读入到”<“的时候,开始读取tag和attribute,同时判断<>里头的内容有没有问题,比如"/"出现的位置和次数有没有问题,属性的表达有没有问题等。之后就只要进行一些判断即可。下面是针对well-formed document的各条件的解决方法:

1、针对“只有一个element不嵌套在别的element里,例如例子中的"customer" ”

设置bool root=false; 当栈空且有入栈操作时root=true;当root=true且在栈空情况下有入栈操作时返回non well-formed

2、针对“嵌套正确,不是<order/>那样的,如<name>与</name>要完整配对嵌套”

栈,非类似<order/>时入栈,入栈忽略属性,出栈时与栈顶元素

3、针对“如<name>与</name>这样的声明名字要配对”

同上

4、针对“一个tag最多一个属性”

若在<>里读到""(输入保证如果有属性,其值一定包括在""里), 则之后如果再出现非空字符,返回non well-formed

5、针对“不递归调用,如address element里不能调用address”

设置set<string>类型,存放栈内元素,入栈前判断set里是否有相同tag,如果是,返回non well-formed

6、针对“有名字的属性,比如上面的format,要有对应的值”

在<>内如果读到空格,空格后面有字符,则必须有紧跟的="XXX"


源代码:

又吐血了……”狗狗搞完40题“里的代码又好短,泪奔了,为什么每次写蘑菇题我都要写得很长╮(╯▽╰)╭

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <stack> 
#include <iostream>
#include <algorithm>
using namespace std;
#define ERROR non=true;return

set<string> used;
stack<string> s;
bool non, root;

bool gettag(char* &ch, string &tag, bool &end, bool &empty)
// 读到"<"触发gettag, 函数结束后">"已读过 
{
    int p1, p2, p3, p4;
    string attribute;
    
    end=false, empty=false;
    tag=attribute="";
    
    ch++;                                   //get tag
    if (*ch=='/'){end=true;ch++;}
    while (isalnum(*ch) || *ch=='-')      
    {
        tag+=*ch;
        ch++;
    }
    while (isspace(*ch)) ch++;
    if (*ch=='>')                            //end of tag?
        return 1;
    if (*ch=='/')
    {
        int cal=0;
        ch++;
        while (*ch!='>'){cal++;ch++;}
        if (cal>0) return -2;
        if (end) return -1;
        else empty=true;
    }
    while (isalnum(*ch) || *ch=='-' || *ch=='.' || *ch=='\"' || *ch=='=')        //get attribute
    {
        attribute+=*ch;
        ch++;
    }
    if (attribute.length()>0)
    {
        p1=attribute.find("=", 0);      if (p1==-1) return -3;
        p2=attribute.find("\"", 0);     if (p2<p1) return -4;
        p2=attribute.find("\"", p1+1);  if (p2==-1) return -5;
        p3=attribute.find("\"", p2+1);  if (p3==-1 || p3==p2+1) return -6;   //empty value
        p4=attribute.find("\"", p3+1);  if (p4!=-1) return -7;               //extra "
        p4=attribute.find("=", p1+1);   if (p4!=-1) return -8;               //extra =
    }
    while (isspace(*ch)) ch++;
    if (*ch=='>') return 1;
    if (*ch=='/')
    {
        int cal=0;
        ch++;
        while (*ch!='>'){cal++;ch++;}
        if (cal>0) return -10;
        if (end) return -9;
        else empty=true;
    }
    while (*ch!='>'){
        ch++;
        if (!isspace(*ch) && *ch!='>') return -11;
    }
    return 1;
}

void solve(char *ch)
{
    bool end, empty;
    string tag;
    int tmp;
    while (!non && *ch!='\0')
    {
        if (*ch=='<')
        {
            tmp=gettag(ch, tag, end, empty);
            if (tmp==1)
            {
                if (end && empty){
                    ERROR;
                }
                if (empty && used.count(tag)>0){
                    ERROR;
                }
                else if (!empty && !end)
                {
                    if (used.count(tag)>0){
                        ERROR;
                    }
                    if (s.empty())
                    {
                        if (root){ERROR;}
                        else root=true;
                    }
                    used.insert(tag);
                    s.push(tag);
                }
                else if (!empty && end)
                {
                    if (s.empty() || s.top()!=tag){
                    ERROR;
                }
                    used.erase(tag);
                    s.pop();
                }
            }
            else{ERROR;}
        }
        else ch++;
    }
}

int main()
{
    string tag, attribute;
    bool firstdata=true;
    bool end, empty;
    char buf[65536];
    do{
        while (gets(buf)!=NULL && strcmp(buf, "<?xml version=\"1.0\"?>")!=0
                && strcmp(buf, "<?end?>\n")!=0)
        {
            solve(buf);
        }
        if (strcmp(buf, "<?xml version=\"1.0\"?>")==0)
        {
            if (!firstdata)
            {
                if (non || !s.empty()) printf("non well-formed\n");
                else printf("well-formed\n");
            }
            else firstdata=false;
            non=false;
            root=false;
            used.clear();
            while (!s.empty()) s.pop();
        }
    }while (strcmp(buf, "<?end?>")!=0);
    if (non || !s.empty()) printf("non well-formed\n");
    else printf("well-formed\n");
    return 0;
}


扩充两个三维体积:ITK实现 在医学图像处理中,经常需要进行 3D 体积的操作,比如合并、分割等。而 ITK (Insight Segmentation and Registration Toolkit) 是一个常用的开源库,可以用于实现各种医学图像处理算法。这篇文章将介绍如何使用 ITK 实现扩充两个三维体积的操作。不过以上代码已经足够简单明了地演示了如何使用 ITK 实现扩充两个三维体积的操作。首先,我们需要准备两个三维体积的数据。这里假设这两个体积大小相同,并且已经加载到内存中了。来读取和保存体积数据,使用了。 阅读详情

相关推荐

Cadence元件库介绍

Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放

年少时的棉花糖 1万+

ZOJ-1116

XML格式校验,有点繁琐的字符串处理,

xhldtc的专栏 524

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5568

蓝书(算法竞赛进阶指南)刷题记录——POJ1911棋盘分割(二维区间DP)

题目:POJ1911. 题目大意:给定一个8∗88*88∗8的矩阵,要求将它切割nnn次(每一次次切割后要选择一个部分,以后只能在这个部分切割),使得它们的均方差最小.设xix_ixi​为第iii个子矩阵的权值和,那么它们的均方差σ\sigmaσ定义为: xˉ=∑i=1nxin,σ=∑i=1n(xi−xˉ)2n \bar{x}=\frac{\sum_{i=1}^{n}x_i}{n},\sigma=...

hzk_cpp的博客 317

Qt QChart实战:从零打造一个实时温度监控仪表盘(附完整源码)

本文详细介绍了如何使用Qt QChart模块从零构建一个工业级实时温度监控仪表盘。通过实战案例,展示了波形图的绘制、坐标轴配置、数据流模拟等关键技术,并提供了完整的源码实现,帮助开发者快速掌握Qt在数据可视化领域的应用。

weixin_42537919的博客 242

DC-DC拓扑:从电感位置一眼识别Buck、Boost与Buck-Boost

本文详细解析了DC-DC拓扑中电感位置对识别Buck、Boost与Buck-Boost电路的关键作用。通过对比不同拓扑的电感连接特征,提供快速识别方法和设计要点,帮助工程师避免常见错误并优化电路性能。特别强调电感位置对输出质量和效率的影响,适合电源设计人员参考。

java2000.net 372

[ZOJ1021] The Willy Memorial Program

【题目大意】有一些竖直的圆筒状管子,管子间有理想的水平细管相连。一只蜘蛛停在某跟管子的某个高度上,从第一根管子往系统注水,问前往营救的老鼠有多长时间可以关闭热水阀门。    最终抽象为当水上升到指定位置的时候系统中的总水柱高度。 【解题思路】 AC思路:(参考“狗狗40题搞完纪念“)从第一根管子开始注水,采用优先队列的方式每次选取可注水且纵坐标最大(最低)的地方进行注水。若中途出现溢出现象,则永远

Dango's happy life 1190

芒果YOLO11改进137:卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

包括YOLOv5、YOLOv7、YOLOv8等模型改进 295

zoj 1021

解析见注释。。。。。。 #include #include #include #include #include #include using namespace std; int t,p,I,total; int x[30],up[30], down[30], p_length[30],water[30]; list > pipe[30];//对应的水面高度以及管道的编号 int targ

zju2016的博客 281

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

2.4 提示词优化

我们在使用大模型的时候,同一任务使用不同表述的提示词,可能得到差异巨大的结果,因为模型的性能高度依赖输入提示词的质量。我们可以通过提示词优化来更高效地获取理想输出。

从0到1,突破自己 1010

zoj1021 The Willy Memorial Program

数据好小,然后乱搞。。。每次都从最下面开始一格一格灌水,然后判断有该格有没有管子相连,有的话就把连的那个管子和当前的管子合并,然后又重新从下面开始灌水, 直到达到或者溢出。。。 PS:好恶心的模拟题啊。。。WA了好久,发现循环变量名写错了一个。。。然后还是WA。。。最后才知道模拟的时候有一个判断的细节没有处理好,这个一定要注意,模拟题什么的要最仔细了,一定得想清楚。。- -# 写的很挫很挫的

wilsonlym的专栏 681

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 143

zoj1021-The Willy Memorial Program(WA)- -!

做到火大的题,还不知道为什么我wa,自己测试了多种情况都对,就是不知道还有什么情况没考虑. #include #include using namespace std; struct Pipe { int x,y; int height; }; struct Link { int l,r; int y; }; Pipe pi[21]; Link lin[51]; bool use[21]

0≡(-∞,+∞) 813

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ZJOI2019 Day2游记(爆0记)

Day0(2019.4.23): 从HL坐校车到余姚,由于前一天晚上打了CF并划了会水所以车上一直在睡觉… 到了宾馆的时候才不到10点,然后就在宾馆划了会水,午饭点了外卖. 到两点半的时候到宾馆门口集合,然后走了大概10分钟到余姚中学报到,之后本来打算直接回宾馆,但听说附近有个万达就跟着学长们去玩了. 发现这个万达好穷啊什么都没有,而且晚饭也没怎么吃饱… 吃完晚饭后回到宾馆继续划水,实在有些饿点了...

hzk_cpp的博客 716

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[POJ 1911] 棋盘

问题描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 均方差 ,其中平均值 ,x i为第...

weixin_30740295的博客 188

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[ZOJ1413][POJ1021] 2D Nim 非人品解法

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1413POJ: http://poj.org/problem?id=1021题目大意:其实和Nim问题是没有关系的。给出两个玩2D-Nim游戏的棋

Dango's happy life 1570

[ZOJ1144][POJ1104] Robbery

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1144POJ:http://poj.org/problem?id=1104题目大意:有大盗光顾了一个W*H的矩形城市。给出一些信息,t时刻大盗不在矩

Dango's happy life 1400

[ZOJ1462][POJ1112] Team Them Up!

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=462POJ: http://poj.org/problem?id=1112题目大意:把一些人分成两组,每一组中的人满足任意两个人都相互认识,且要求两组

Dango's happy life 1265

[ZOJ1518][POJ1291] This Sentence is False

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1518POJ: http://poj.org/problem?id=1291题目大意:有n个句子,编号为1..n,为Sentence XXX is

Dango's happy life 1176

[ZOJ1391][POJ1436] Horizontally Visible Segments

题目大意:若两条竖直线段之间可以连一条水平线,这条水平线不与其他竖直线段相交,称这两条竖直线段为“相互可见”的。若存在三条竖直线段,两两”相互可见“,则构成”线段三角形“。给出一些竖直的线段,问一共有多少”线段三角形“解题思路:这道题在刘汝佳的黑书里有解题思路的指导,在图论部分出

Dango's happy life 1134

[ZOJ1301][POJ1137] The New Villa

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1301POJ: http://poj.org/problem?id=1137题目大意:每个房间的开关经常是控制别的房间的灯的。

Dango's happy life 1089

[ ZOJ 1197 ] [POJ 1486] Sorting Slides

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1197 POJ: http://poj.org/problem?id=1486 题目大意: 有一些透明的幻灯片乱放成一大堆。

Dango's happy life 1050

[ZOJ 1387] [POJ 1432] Decoding Morse Sequences

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1387POJ: http://poj.org/problem?id=1432题目大意:给出一个字母的译码表,给出一个有n个单词的字典,给出一串编码。问再给出字典中有多少种不同的解码方式。题目分析:首先编码只有-和.,可以很方便地建立一棵Trie树,还是最熟悉的二叉方

Dango's happy life 1048

[ ZOJ 1043 ][ POJ 1108 ] Split Windows

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1043POJ: http://poj.org/problem?id=1108题目大意:(图见原题)每一个无分割的窗口有一个大写字母标签。每个窗口左上角有大写字母标签,其他三个角有*号,上下边界用-,左右边界用|表示。每个窗口分割可以用一颗二叉树表示,表示方式如下:1

Dango's happy life 1027

[ZOJ 1463] Brackets Sequence

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1463 题目大意:给出括号序列的递归定义:1、空序列2、如果S是括号序列,那么(S) [S]也是3、如果A和B是括号序列,那么AB也是给出一个串,添加最少的()[]使串变为括号序列,输出结果。 解题思路:一直不记得在哪里做过,不过只需要输出添加的括号数……比较经典的DP模型,

Dango's happy life 939
上一篇: [ ZOJ 1043 ][ POJ 1108 ] Split Windows
下一篇: [ ZOJ 1197 ] [POJ 1486] Sorting Slides
program_shun
博客等级 码龄17年 10粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值