Grammar Lessons CodeForces - 113A

原题链接
考察:模拟
思路:
  坑点比较多:
(1) 判断不符合语法的单词
(2) 只允许存在一个名词

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010,M = 10;
string s[N];
int n,cnt[N];
string gender[M] = {"etr","lios","initis","etra","liala","inites"};
bool check_gen()
{
	int l = 0,r = 0,cs = 0;
	memset(cnt,-1,sizeof cnt);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<6;j++)
		  if(s[i].size()>=gender[j].size())
		  {
		  	string it = s[i].substr(s[i].size()-gender[j].size(),gender[j].size());
		  	if(it!=gender[j])  continue;
		  	cnt[i] = j;
		  	if(j<3) l++;
		  	else r++;
		  	break;
		  }
		if(cnt[i]==-1) return 0;
	}
	if(cnt[0]==-1) return 0;
	if(n==1&&cnt[0]!=-1) return 1; 
	if(l&&r) return 0;
	l = 0,r = 0;
	for(int i=0;i<n;i++)
	  if(!cnt[i]||cnt[i]==3) l++,r = i;
	if(l!=1) return 0;
	for(int i=0;i<r;i++)
	  if(cnt[i]!=1&&cnt[i]!=4) return 0;
	for(int i=r+1;i<n;i++)
	  if(cnt[i]!=2&&cnt[i]!=5) return 0;
	return 1;
}
int main()
{
	while(cin>>s[n]) n++;
	printf("%s\n",check_gen()?"YES":"NO");
	return 0;
}
posted @ 2021-08-30 19:36  acmloser  阅读(36)  评论(0编辑  收藏  举报