A 语言
题目大意:(懒得写,学过英语就能看懂
分析:题中说,要求构成一个句子,显然句中只可出现一个动词.
则已经排除一种情况:有大于等于两个wi=4时,必有两个动词,排除.
另一种情况显然可得:若有wi=4,则句中的动词必为wi=4的那个.
显然,wi的位置是不可能在最前与最后的.
再来看这个什么NP
显然现在只剩下形容词&名词了
由题意,NP的最小组成为名词,之后则为在名词前加形容词,在名词前加名词.
由上得出,若NP合法,则其结尾必为名词.
就可以知道,只要判动词前和结尾的两个动词是否为名词,再加上之前两种情况就好了.
Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 1000001
ll T;
ll letter[30];
ll a[MAXN];
ll V[MAXN];//存动词
signed main()
{
cin>>T;
for(ll TT=1;TT<=T;TT++)
{
ll tot=0;
ll cnt_4=0,wz_4=-1231;
for(ll i=1;i<=26;i++)
cin>>letter[i];
string S;
cin>>S;
ll P=S.size();
for(ll i=0;i<P;i++)
{
a[i+1]=letter[S[i]-'a'+1];
if(a[i+1]==7||a[i+1]==6||a[i+1]==5) V[++tot]=i+1;
if(a[i+1]==4) V[++tot]=i+1,cnt_4++,wz_4=i+1;
}
if(a[1]==4||a[P]==4)
{
cout<<"No"<<endl;
continue;
}
if(cnt_4>=2)
{
cout<<"No"<<endl;
continue;
}
if(wz_4!=-1231)
{
if((a[wz_4-1]==2||a[wz_4-1]==3||a[wz_4-1]==6||a[wz_4-1]==7)&&(a[P]==2||a[P]==3||a[P]==6||a[P]==7))
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
continue;
}
bool TY=0;
for(ll i=1;i<=tot;i++)
{
if(V[i]==1||V[i]==P) continue;
if((a[V[i]-1]==2||a[V[i]-1]==3||a[V[i]-1]==6||a[V[i]-1]==7)&&(a[P]==2||a[P]==3||a[P]==6||a[P]==7))
{
TY=1;
break;
}
}
//cout<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
if(TY==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
//复杂度:O(n)
}

京公网安备 11010502036488号