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

CF113A Grammar Lessons 题解

一道模拟题。


题目传送门

题目意思:

给你一个句子,让你检查这个句子的语法是否正确。(语法请自行在题目中查看)


思路:

就是模拟。依次判断这个句子是否符合每一条语法即可。但是细节很多就因为细节我错了好多次!具体看代码注释。


代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
string a[N];
int cnt;
bool fh(string s)//判断单词是否合法
{int len=s.size();s=" "+s;if(s[len]=='s'&&s[len-1]=='o'&&s[len-2]=='i'&&s[len-3]=='l')return 1;if(s[len]=='r'&&s[len-1]=='t'&&s[len-2]=='e')return 1;if(s[len]=='s'&&s[len-1]=='i'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 1;if(s[len]=='a'&&s[len-1]=='l'&&s[len-2]=='a'&&s[len-3]=='i'&&s[len-4]=='l')return 1;if(s[len]=='a'&&s[len-1]=='r'&&s[len-2]=='t'&&s[len-3]=='e')return 1;if(s[len]=='s'&&s[len-1]=='e'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 1;return 0;
}
bool fx(string s)//判断单词的性别
{int len=s.size();s=" "+s;if(s[len]=='s'&&s[len-1]=='o'&&s[len-2]=='i'&&s[len-3]=='l')return 1;if(s[len]=='r'&&s[len-1]=='t'&&s[len-2]=='e')return 1;if(s[len]=='s'&&s[len-1]=='i'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 1;if(s[len]=='a'&&s[len-1]=='l'&&s[len-2]=='a'&&s[len-3]=='i'&&s[len-4]=='l')return 0;if(s[len]=='a'&&s[len-1]=='r'&&s[len-2]=='t'&&s[len-3]=='e')return 0;if(s[len]=='s'&&s[len-1]=='e'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 0;
}
int fc(string s)//判断单词的词性
{int len=s.size();s=" "+s;if(s[len]=='s'&&s[len-1]=='o'&&s[len-2]=='i'&&s[len-3]=='l')return 1;if(s[len]=='r'&&s[len-1]=='t'&&s[len-2]=='e')return 2;if(s[len]=='s'&&s[len-1]=='i'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 3;if(s[len]=='a'&&s[len-1]=='l'&&s[len-2]=='a'&&s[len-3]=='i'&&s[len-4]=='l')return 1;if(s[len]=='a'&&s[len-1]=='r'&&s[len-2]=='t'&&s[len-3]=='e')return 2;if(s[len]=='s'&&s[len-1]=='e'&&s[len-2]=='t'&&s[len-3]=='i'&&s[len-4]=='n'&&s[len-5]=='i')return 3;
}
int main()
{while(cin>>a[++cnt]);cnt--;int x=0,y=0;for(int i=1;i<=cnt;i++){if(!fh(a[i]))//不合法直接输出NO{cout<<"NO";return 0;}if(fx(a[i]))x++;else y++;}if(!((!x&&y)||(x&&!y))){//性别不一样输出NOcout<<"NO";return 0;}int num=0;if(cnt==1&&fh(a[1])){cout<<"YES";return 0;}//只有一个合法单词输出YESif(cnt==2){//只有两个单词的特殊情况if(fc(a[1])==1&&fc(a[2])!=2){//第一个单词是形容词但是第二个单词不是名词cout<<"NO";return 0;}if(fc(a[1])==2&&fc(a[2])!=3){//第一个单词是名词但是第二个单词不是动词cout<<"NO";return 0;}if(fc(a[1])==3){//第一个单词是动词cout<<"NO";return 0;}cout<<"YES";return 0;}for(int i=2;i<cnt;i++){if(fc(a[i])==1){//如果当前单词是形容词if(fc(a[i-1])==1&&(fc(a[i+1])==1||fc(a[i+1])==2))continue;cout<<"NO";//如果形容词的上一个不是形容词或者形容词的下一个不是形容词或名词就输出NOreturn 0;}if(fc(a[i])==2){//如果当前单词是名词if(fc(a[i-1])==1&&fc(a[i+1])==3)continue;cout<<"NO";//如果名词的上一个不是形容词或者名词的下一个不是动词就输出NOreturn 0;}if(fc(a[i])==3){//如果当前单词是动词if((fc(a[i-1])==3||fc(a[i-1])==2)&&fc(a[i+1])==3)continue;cout<<"NO";//如果动词的上一个不是动词或名词,或者动词的下一个不是动词就输出NOreturn 0;}}for(int i=1;i<=cnt;i++)if(fc(a[i])==2)num++;//判断有多少个名词if(num!=1&&cnt>1){//有多个名词就输出NOcout<<"NO";return 0;}cout<<"YES";//改句子符合语法,输出YESreturn 0;
}

完美撒花~

http://www.lryc.cn/news/128572.html

相关文章:

  • puzzle(0414)六边形拼图
  • 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测
  • BEV感知实时构建路口拓扑 觉非科技基于MapTR的优化与实践
  • 如何在TikTok“点火”?用时下最流行的工具解码赚钱
  • set NOCOUNT on
  • 垃圾回收机制
  • Golang 程序性能优化利器 PGO 详解(一):简单介绍及使用
  • redis key操作的相关命令
  • WebRTC | 网络传输协议RTP与RTCP
  • 160. 相交链表
  • 【MFC】12.双缓冲序列化机制-笔记
  • Linux 终端会话中,启动任务并放到后台运行
  • 软考笔记——10.项目管理
  • 算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向
  • Java Vue Uniapp MES生产执行管理系统
  • 深入探究Socks5代理与IP代理在网络安全与爬虫中的应用
  • Vue使用jspdf和html2canvas组件库结合导出PDF文件
  • 7. 实现 API 自动生成
  • 使用Druid解析SQL,获取SQL中所有使用的表
  • 公司内部测试团队可以替代专业的软件检测机构吗,性能测试怎么收费?
  • Three.js之相机、渲染器、光源、动画、性能监测
  • Seaborn图表使用指南!
  • [C++ 网络协议编程] TCP/IP协议
  • Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表
  • 记一次fegin调用的媒体类型问题
  • 在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)
  • 如何仿写简易tomcat 实现思路+代码详细讲解
  • 如何提高深度学习性能
  • ECMAScript版本对比:从ES1到ES2021
  • 设计HTML5表格