当前位置: 首页 > news >正文

UVa 384 Slurpys

题目描述

基于一组约束识别字符串是一个常见的计算问题。

Slurpy\texttt{Slurpy}Slurpy是一种具有特定属性的字符串。你的程序将读取字符串并判断它们是否为Slurpy\texttt{Slurpy}Slurpy

定义

Slump\texttt{Slump}Slump是一个满足以下属性的字符串:

  1. 第一个字符是DE
  2. 第一个字符后跟一个或多个F
  3. F的序列后跟一个Slump\texttt{Slump}Slump或一个G,以此结束整个Slump\texttt{Slump}Slump
  4. 除此之外都不是Slump\texttt{Slump}Slump

例如:DFFEFFFG是一个Slump\texttt{Slump}Slump(以D开头,后跟两个F,再跟Slump\texttt{Slump}SlumpEFFFG

Slimp\texttt{Slimp}Slimp是一个满足以下属性的字符串:

  1. 第一个字符是A
  2. 如果是两个字符的Slimp\texttt{Slimp}Slimp,则第二个字符是H
  3. 如果不是两个字符,则属于以下两种形式之一:
    • A+B+Slimp\texttt{Slimp}Slimp+C
    • A+Slump\texttt{Slump}Slump+C
  4. 除此之外都不是Slimp\texttt{Slimp}Slimp

Slurpy\texttt{Slurpy}Slurpy是一个由Slimp\texttt{Slimp}Slimp后跟Slump\texttt{Slump}Slump组成的字符串。

输入格式

第一行包含整数NNN1≤N≤101 \leq N \leq 101N10),表示字符串数量。接下来NNN行,每行包含一个由字母组成的字符串(长度1∼601 \sim 60160)。

输出格式

第一行输出SLURPYS OUTPUT。接下来NNN行,每行输出YESNO。最后一行输出END OF OUTPUT

样例输入

2 AHDFG DFGAH

样例输出

SLURPYS OUTPUT YES NO END OF OUTPUT

题目分析

问题的本质

这是一个递归下降解析问题。需要根据给定的上下文无关文法判断字符串是否属于定义的语言。

文法规则

Slump → D F+ (Slump | G) Slimp → A H | A B Slimp C | A Slump C Slurpy → Slimp Slump

解析方法

使用递归下降解析器,维护一个全局位置指针,尝试匹配规则。


参考代码

// Slurpys// UVa ID: 384// Verdict: Accepted// Submission Date: 2016-06-30// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;boolisC();boolisSlump();boolisSlimp();boolisSlurpy();string line;intposition;// 解析字符 'C'boolisC(){if(position<line.length()&&line[position]=='C'){position++;returntrue;}returnfalse;}// 解析 Slump: D/E F+ (Slump | G)boolisSlump(){if(position>=line.length())returnfalse;if(line[position]!='D'&&line[position]!='E')returnfalse;position++;// 至少一个 FboolatLeastOneF=false;while(position<line.length()&&line[position]=='F'){atLeastOneF=true;position++;}if(!atLeastOneF)returnfalse;// 以 G 结尾if(position<line.length()&&line[position]=='G'){position++;returntrue;}// 或者后面跟一个 SlumpreturnisSlump();}// 解析 Slimp: A H | A B Slimp C | A Slump CboolisSlimp(){if(position>=line.length()||line[position]!='A')returnfalse;position++;// 情况1:AHif(position<line.length()&&line[position]=='H'){position++;returntrue;}// 情况2:A B Slimp Celseif(position<line.length()&&line[position]=='B'){position++;if(!isSlimp())returnfalse;if(position<line.length()&&line[position]=='C'){position++;returntrue;}returnfalse;}// 情况3:A Slump Celse{if(!isSlump())returnfalse;if(position<line.length()&&line[position]=='C'){position++;returntrue;}returnfalse;}}// 解析 Slurpy: Slimp + SlumpboolisSlurpy(){intsavedPos=position;if(isSlimp()&&isSlump()&&position==line.length())returntrue;position=savedPos;returnfalse;}intmain(intargc,char*argv[]){ios::sync_with_stdio(false);string firstLine;getline(cin,firstLine);intn=stoi(firstLine);cout<<"SLURPYS OUTPUT"<<endl;for(inti=1;i<=n;i++){getline(cin,line);position=0;cout<<(isSlurpy()?"YES":"NO")<<endl;}cout<<"END OF OUTPUT"<<endl;return0;}
http://www.jsqmd.com/news/949786/

相关文章:

  • 终极指南:一键修复Visual C++运行库,彻底解决“DLL缺失“问题
  • 看完就会:2026年闭眼可入的专业AI论文网站
  • 如何在10分钟内为OBS Studio添加现代化网页集成功能?
  • 找日结工作用什么平台?2026年零工平台实测与选择指南 - 资讯焦点
  • Python入门:VS Code配置Python开发环境全攻略
  • 读博期间应该怎么提升自己的科研能力?
  • 利用PAM8403功放与旧手机打造低成本立体声音响系统
  • 内核级硬件伪装技术深度解析:EASY-HWID-SPOOFER实现机制揭秘
  • 树莓派4 USB SSD启动Ubuntu全攻略:告别SD卡,提升性能与可靠性
  • 天津奢侈品首饰回收哪家靠谱?2026和平正规门店高价变现攻略 - 薛定谔的梨花猫
  • 酒店前台预订+后台管理全静态页面包,纯HTML/CSS/JS实现,开箱即用适合学生实训
  • 计算机毕业设计之基于hadoop的河北省房价数据分析与可视化预测
  • 论文中卷积神经网络常见的示意图用什么软件来画比较容易?
  • 北京手表回收哪家强?2026实测,这家口碑断层稳居首位 - 奢侈品回收测评
  • 实战部署wvp-GB28181-pro:构建企业级视频监控平台的完整指南
  • 2026年度上海保鲜蔬菜冷库工程安装企业综合甄选推荐 - 品牌2026
  • DIY强力口袋吸尘器:从电机选型到PVC外壳的完整制作指南
  • 计算机毕业设计之基于echarts的心脏病健康管理大数据可视化系统的设计与实现
  • 鸿蒙南向开发教程 Day 8:信号量三种类型详解
  • 如何在Windows 11任务栏实现沉浸式歌词显示:Taskbar-Lyrics完全指南
  • 万象透骨膏小程序商城开发全攻略
  • 2026 杭州高端全屋定制优选榜单|5 大品牌从环保、设计、落地全方位测评 - 商业新知
  • 2026年5款做简历工具推荐:从空白到投递全程省心的工具盘点
  • 流年寄钻戒,踏遍杭城街巷,找寻善待往事的靠谱回收店 - 奢侈品回收评测
  • 几十页文献一分钟就能读懂,文献解读神器实测
  • LinkSwift技术解析:基于JavaScript的跨平台网盘直链获取方案
  • Tabletop Simulator终极备份指南:如何一键保护你的虚拟桌游资产
  • MATLAB版SRCNN超分重建工具包:一键运行+操作视频+21张测试图
  • 别再乱用(int)了!C/C++中浮点数转整数的‘向零取整’陷阱与正确四舍五入方法
  • 树莓派智能拍照亭:从GPIO控制到图像处理的嵌入式开发实践