Peculiar Movie Preferences (CF2D)(贪心+字符串相关操作)

思路:
- 通过题目提前关键的重要信息然后来找出相应的性质
- 从最多的字符串长度为3入手, 发现性质: 只用2个字符串就可以构造出回文, 如果2个不行,那就一定不行
- 当然这个性质也可以贪心的猜想,让后在去证明
- 然后 利用回文串的性质即可, 注意 长度为1也是回文串的重要点
- 处理利用map即可很方便, 注意字符串的相关操作
- s.substr(位置,长度)
- reverse(s.begin(),s.end())
反思:
- 注意利用hash思想去对字符串数字化时, 一定要取模+双hash, 直接用 会有冲突的,和进制区分开

#include <bits/stdc++.h> using namespace std; #define M 2000005 #define ri register int int n,m; int T; map<string,int> mp[3]; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while(T--) { cin>>n; mp[1].clear(); mp[0].clear(); int fg=0; for(ri i=1;i<=n;i++) { string s; cin>>s; if(s.length()==1) { fg=1; } if(s.length()==2) { if(s[0]==s[1]) fg=1; reverse(s.begin(),s.end()); if(mp[0][s.substr(0,2)]) fg=1; if(mp[1][s.substr(0,2)]) fg=1; reverse(s.begin(),s.end()); mp[0][s]=1; } if(s.length()==3) { if(s[0]==s[2]) fg=1; reverse(s.begin(),s.end()); if(mp[0][s]) fg=1; if(mp[0][s.substr(0,2)]) fg=1; reverse(s.begin(),s.end()); mp[0][s]=1; mp[1][s.substr(0,2)]=1; } } if(fg) cout<<"YES\n"; else cout<<"NO\n"; } return 0; }