UVALive - 6258

/*************************************************************************
    > Author: MentalOmega
    > Mail: 965194745@qq.com
    > Created Time: 2017年10月14日
    > function:题目意思是给你一串字符串,如果这个字符串的任意连续字串中都存在一个数是独一无二的就输出不无聊
    由于是要要求是任意连续字串。先考虑最长的那个字串,先找到一个能够满足他的。
    比如字串12321,3能照顾到整个字串,那么只要包含3的字串都是合法的,不包含3的就是剩下12和21,相当于被3劈成两半
    这两半就是一个子问题了
 ************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e6+10;
int n;
struct Node
{
    int v;
    int prev,nextv;//离他最近值相同的坐标
}node[MAXN];
bool dfs(int left,int right)
{
    for(int l=left,r=right;r>=l;l++,r--)//左右同时找,防止独一无二的数聚集在一侧那么会退化成n方
    {
        if(node[l].prev<left&&node[l].nextv>right)
            return dfs(left,l-1)&&dfs(l+1,right);
        if(node[r].prev<left&&node[r].nextv>right)
            return dfs(left,r-1)&&dfs(r+1,right);
    }
    return left>=right;
}
int main()
{
    if (fopen("in.txt", "r") != NULL)
    {
        freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
    }
    int t;
    cin>>t;
    while(t--)
    {
        map<int,int> mp;
        cin>>n;
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            int v;
            cin>>v;
            if(mp.count(v)==0)
                mp[v]=cnt++;
            v=mp[v];
            node[i]={v,0,n+1};
        }
        int vis[cnt]={0};
        for(int i=1;i<=n;i++)
        {
            node[i].prev=vis[node[i].v];
            vis[node[i].v]=i;
        }
        fill(vis,vis+cnt,n+1);
        for(int i=n;i>=1;i--)
        {
            node[i].nextv=vis[node[i].v];
            vis[node[i].v]=i;
        }
        cout<<(dfs(1,n)?"non-boring":"boring")<<'\n';
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值