UVALive

来源:互联网 发布:湖南网络工程学院宿舍 编辑:程序博客网 时间:2024/06/03 23:48
/*************************************************************************    > 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;}
原创粉丝点击