这题刚开始不是MLE就是RE,后来发现用string就没问题,不知道是什么机理……本来是用回溯法做的,结果各种WA,上网搜了下,发现有说什么有限状态自动机,完全不懂……然后发现用模拟也可以做,从后向前判断,否则相当复杂。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string s;
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>s;
int flag=1;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]=='e')
{
if(i>1&&s[i-1]=='n'&&s[i-2]=='o')
{
i-=2;continue;
}
flag=0;break;
}
if(s[i]=='n')
{
if(i>0&&s[i-1]=='i')
{
i-=1;continue;
}
if(i>3&&s[i-1]=='o'&&s[i-2]=='t'&&s[i-3]=='u'&&s[i-4]=='p')
{
i-=4;continue;
}
flag=0;break;
}
if(s[i]=='t')
{
if(i>4&&s[i-1]=='u'&&s[i-2]=='p'&&s[i-3]=='t'&&s[i-4]=='u'&&s[i-5]=='o')
{
i-=5;continue;
}
if(i>1&&s[i-1]=='u'&&s[i-2]=='o')
{
i-=2;continue;
}
if(i>3&&s[i-1]=='u'&&s[i-2]=='p'&&s[i-3]=='n'&&s[i-4]=='i')
{
i-=4;continue;
}
flag=0;break;
}
flag=0;break;
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}