您的位置:首页 > 其它

UVALive - 6258

2017-10-14 21:50 295 查看
/*************************************************************************
> 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: