UVA

来源:互联网 发布:全国地址数据库 编辑:程序博客网 时间:2024/06/05 23:06

妈耶,,,昨天的比赛题,直接看不懂题意撒
格老子滴英语都不如初中生,可我还要坚持下去,,,,不怂就干

题意,任意 子串,都包含一个只出现过一次的数字,
然后我们想到,给定的串至少有一个数字是出现过一次的,一个串,我们找到这个数字,包含这个数字的串都是满足题意的,然后我们递归下去,对他两边的字串再进行求解,,
递归的边界就是只包含一个数字的时候,下一步退出

ps:最近再看算法导论,感觉不错

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <set>#include <map>#include <stack>#include <queue>#include <ctype.h>#include <vector>#include <algorithm>#include <time.h>// cout << "  ===  " << endl;using namespace std;typedef long long ll;const int maxn = 200000 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;int T, n;int a[maxn], l[maxn], r[maxn];bool solve(int l_, int r_) {    if(l_ >= r_) return true;    //int mid = (l_ + r_) / 2;    int ll = l_, rr = r_;    while(ll <= rr) {        if(l[ll] < l_ && r[ll] > r_)            return ( solve(l_, ll-1) && solve(ll+1, r_) );        if(l[rr] < l_ && r[rr] > r_)            return ( solve(l_, rr-1) && solve(rr+1, r_) );        ll++, rr--;    }    return false;}int main() {    scanf("%d", &T);    while(T--) {        scanf("%d", &n);        map<int, int> mp;        for(int i = 0; i < n; ++i) {            scanf("%d", &a[i]);            if(mp.count(a[i])) {                r[mp[a[i]]] = i;                l[i] = mp[a[i]];                r[i] = INF;            }            else {                l[i] = -1;                r[i] = INF;            }            mp[a[i]] = i;        }        if(solve(0, n-1)) puts("non-boring");        else puts("boring");    }    return 0;}
原创粉丝点击