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)
}