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;
    
    
}
View Code

 

posted @ 2023-02-14 15:32  VxiaohuanV  阅读(23)  评论(0编辑  收藏  举报