D. Carousel
题意
n个数字围成一个环,现在要求对n个数进行染色。
染色要求是,对于相邻的两个数,如果不同的话,要求颜色也要不一样。那么如果相邻两个数相同,颜色可以不同,也可以相同。
思路
一、如果所有数字都一样的话,只需要染上同一种颜色即可。
二、如果数字的个数有偶数个,那么只需要两种颜色,按照1 2 1 2...1 2 1 2这样染色即可。
三、如果数字的个数有奇数个,去看遍历一下这个环,看是不是有相邻的数字是一样的,如果有,我们只需要对其中一组相邻的数字染上同一种颜色,对于剩下的继续按照1 2 1 2...1 2 1 2染色即可。其实这样等价是把奇数个数字变成了意义上的偶数个。(注意这是个环,第一个数字和最后一个数字也是相邻的 需要特判下)
如果不存在相邻的相同数字的话,则需要三种颜色,按照1 2 1 2...1 2 1 2染色,最后一个数字染色为2。

#include<bits/stdc++.h>
using namespace std;
int a[1<<18];
int main(){
    int t;cin>>t;
    while(t--){
        int n;cin>>n;
        set<int> s;
        for(int i=1;i<=n;i++) cin>>a[i],s.insert(a[i]);
        if(s.size()==1){
            cout<<1<<endl;
            while(n--) cout<<"1 ";
        }
        else if(n%2==0)
        {
            cout<<2<<endl;
            for(int i=1;i<=n/2;i++) cout<<"1 2 ";
        }
        else
        {   
            int flag=0;
            for(int i=1;i<=n;i++) 
                if(a[i]==a[i-1]) {
                    flag=1;break;
                }
            if(a[n]==a[1]) flag=1;
            if(flag){
                cout<<2<<endl;
                flag=0;
                int k=1;
                for(int i=1;i<=n;i++){
                    if(!flag && a[i]==a[i-1]){
                        k^=3;
                        flag=1;
                    }
                    cout<<k<<" ";
                    k^=3;
                }
            }
            else {
                cout<<3<<endl;
                for(int i=1;i<=n/2;i++) cout<<"1 2 ";
                cout<<3;
            }
        }
        cout<<endl;
    }
    return 0;
}