POJ 1126:Simply Syntax
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 5264 | Accepted: 2337 |
Description
asked them to write a program that could check the syntactical correctness of any sentence they wrote. Similar to the nature of Hedonians, the syntax of Hedonian is also pleasantly simple. Here are the rules:
0.The only characters in the language are the characters p through z and N, C, D, E, and I.
1.Every character from p through z is a correct sentence.
2.If s is a correct sentence, then so is Ns.
3.If s and t are correct sentences, then so are Cst, Dst, Est and Ist.
4.Rules 0. to 3. are the only rules to determine the syntactical correctness of a sentence.
You are asked to write a program that checks if sentences satisfy the syntax rules given in Rule 0. - Rule 4.
Input
that each sentence has at most 256 characters and at least 1 character.
Output
an end-of-file character.
Sample Input
Cp
Isz
NIsz
Cqpq
Sample Output
NO
YES
YES
NO
题意是判断所给出的字符串是否符合题目中所给出的五项标准。
第0项:句子中的字母只能是p到z,和N、C、D、E、I。
第1项:每一个p到z的字母就单独是一个正确的句子。(这个其实很关键,标志了到底有几个句子,就是有多少个这样的小写字母就有多少个正确句子,一开始我就是没怎么仔细看第一个条件导致对第四个样例输出结果有疑惑。)
第2项:如果s是一个正确句子,那么Ns也是一个正确句子。
第3项:如果s和t是正确句子,那么Cst,Dst,Est,Ist也是正确句子。
第4项:只有规则0到3是判断句子是否正确的规则,其余的不算数。
输出只能是一个正确句子,两个以上的不行。
比方说sz。
因为s是一个正确句子,z也是一个正确句子,这样的话sz就有两个了,除非前面有N、C、D、E、I,变成一个,否则不行。
首先说一下:The input consists of a number of sentences consisting only of characters p through z and N, C, D, E, and I. 尽管是有这句话,但还是要考虑有其他字符出现的情况,可能这里会跪掉。
一开始想拿到一个字符串的话,扫描其字符有两种方式,从左至右或者是从右至左。然后自己想从左至右的话是怎么弄怎么麻烦,因为碰到C、D、E、I还要记录吃掉后面的两个句子,这样碰到要标记再碰到再标记。就觉得很麻烦,不如从右至左,遇到一个q到z,句子flag就加一。遇到N,flag不变。遇到N、C、D、E、I就flag减一。遇到其他字符的flag直接赋为0。最后看flag是否等于1,不等于的就No。
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; int flag; void cal(string s)
{
if(s.length() == 0)
{
return;
}
else
{
int len=s.length();
if(s[len-1]>='p' && s[len-1]<='z')
{
flag++;
cal(s.substr(0,len-1));
}
else if(s[len-1]=='N')
{
cal(s.substr(0,len-1));
}
else if(s[len-1]=='C'||s[len-1]=='D'||s[len-1]=='E'||s[len-1]=='I')
{
flag--;
cal(s.substr(0,len-1));
}
else
{
flag=0;
return;
}
}
} int main()
{
string s;
while(cin>>s)
{
flag=0; cal(s); if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1126:Simply Syntax的更多相关文章
- Simply Syntax(思维)
Simply Syntax Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5551 Accepted: 2481 Des ...
- POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)
http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...
- POJ 3252:Round Numbers
POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...
- 【九度OJ】题目1126:打印极值点下标 解题报告
[九度OJ]题目1126:打印极值点下标 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1126 题目描述: 在 ...
- POJ 1459:Power Network(最大流)
http://poj.org/problem?id=1459 题意:有np个发电站,nc个消费者,m条边,边有容量限制,发电站有产能上限,消费者有需求上限问最大流量. 思路:S和发电站相连,边权是产能 ...
- POJ 3436:ACM Computer Factory(最大流记录路径)
http://poj.org/problem?id=3436 题意:题意很难懂.给出P N.接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2* ...
- POJ 2195:Going Home(最小费用最大流)
http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...
- POJ 3281:Dining(最大流)
http://poj.org/problem?id=3281 题意:有n头牛,f种食物,d种饮料,每头牛有fnum种喜欢的食物,dnum种喜欢的饮料,每种食物如果给一头牛吃了,那么另一个牛就不能吃这种 ...
- POJ 3580:SuperMemo(Splay)
http://poj.org/problem?id=3580 题意:有6种操作,其中有两种之前没做过,就是Revolve操作和Min操作.Revolve一开始想着一个一个删一个一个插,觉得太暴力了,后 ...
随机推荐
- 微信web版接口api(转)
安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...
- Day2-O-Coloring a Tree CodeForces-902B
You are given a rooted tree with n vertices. The vertices are numbered from 1 to n, the root is the ...
- 运算符 Operator 及优先级
算数运算符 + - * / ** % /表示自然除,结果是浮点数.//为整除.python2.x版本/和//都是整除. 位运算符 & | ~ ^ << >> <& ...
- 创建用户(adduser和useradd)和删除用户(userdel)及
一 用户创建命令: # adduser 用户名 # useradd 用户名 1) useradd 与 adduser 的区别 在CentOs系统中: useradd与adduser是没有区别的, ...
- firewalld学习--维护命令
启动 systemctl start firewalld 停止 systemctl stop firewalld 重启 systemctl restart firewalld 查询状态 systemc ...
- 基于vue-router的移动端网页的路由管理
本篇代码示例:github 前提:不关注移动端浏览器的前进事件 涵盖功能: 1,管理路由的历史记录 2,切页动画的实现 3,处理流程类页面的回退事件 描述: 流程类页面的回退事件的解释: 以注册 ...
- android侧滑效果(引用官方网站提供的API文件)
原文地址:http://www.cnblogs.com/android100/p/android-SlidingMenu.html 在新浪微博和唱吧里面都有看到android的侧滑效果,于是想要学习一 ...
- ffmpeg 知识点
ffmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...
- bean的autowire属性及其生命周期
一:sutowire属性 1.no:默认值,禁用自动装配: 2.byName:根据属性名称自动装配: 3.byType:根据属性类型自动装配: 4.constructor:通过构造方法自动装配,不推荐 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Map接口使用的注意事项
import java.util.HashMap ; import java.util.Map ; import java.util.Set ; import java.util.Iterator ; ...