题解:P15478 [CERC2012] Chemist’s vows
Code_to_Win · · 题解
题解:P15478 [CERC2012] Chemist’s vows
思路
先打一张元素周期表,用 unordered_set 储存:
::::success[元素周期表]
unordered_set<string> elem={"h","he","li","be","b","c","n","o","f","ne","na","mg","al","si","p","s","cl","ar","k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr","rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe","cs","ba","la","ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu","hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn","fr","ra","ac","th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr","rf","db","sg","bh","hs","mt","ds","rg","cn","fl","lv"};
::::
设 dp[i] 为表示单词的前
-
将
dp[0]初始化为true,因为空串克拉拉可以读出。 -
如果
dp[i]=true,尝试取str[i]和str[i,i+1],只要有一个在集合里,就可以转移。
::::success[AC Code]
#include<bits/stdc++.h>
#define unordered_set set
using namespace std;
set<string> elem={"h","he","li","be","b","c","n","o","f","ne","na","mg","al","si","p","s","cl","ar","k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr","rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe","cs","ba","la","ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu","hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn","fr","ra","ac","th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr","rf","db","sg","bh","hs","mt","ds","rg","cn","fl","lv"};
signed main(){
int t; cin>>t;
while(t--){
string str; cin>>str;
int n=str.size();
vector<bool> dp(n+1,false);
dp[0]=true;
for(int i=0;i<n;i++){
if(!dp[i]) continue;
string first;
first+=tolower(str[i]);
if(elem.count(first)) dp[i+1]=true;
if(i+1<n){
string second;
second+=tolower(str[i]);
second+=tolower(str[i+1]);
if(elem.count(second)) dp[i+2]=true;
}
}
cout<<(dp[n]?"YES":"NO")<<endl;
}
return 0;
}
::::
题解来之不易,点个赞再走吧……