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