您的位置:首页 > 产品设计 > UI/UE

UVA1608_Non-boring sequences

2015-09-10 03:15 453 查看
Non-boring sequences

大致题意:

给你一个字符串,问你他的任一子串是否都包含一个唯一的字符

思路:

看似简单,实际一丁点思路都没有

后面看汝佳的讲解都看了好长时间

大概思路就是,先找一个唯一字符,然后递归这个字符左右两边的字符串,看他们是否满足,知道只含一个元素.但是万一那个唯一元素是最后一个元素呢???这样复杂度就是n方了,这个时候神奇的优化方法出现了!!!!从两边往中间找,最坏情况就是在中间!!!!!

因为Tn = 2*T(n/2) + O(n),最坏也就nlogn

这样的优化方案简直是反人类!!!

不过却真的要好好总结

虽然说我也说不好为什么要这样优化

YY:

为什么要这样呢,因为不管怎么找都会存在一个最坏的情况,所以我们要让最坏的情况"最好",首先最坏情况肯定是查找到最后一个才是,那么先加上O(n)!!!!那如何优化最好呢???一个想法就是让O(n)最坏的情况出现次数最少,那么二分思想就容易想到了,因为使用二分能最快的到达只含有一个元素情况!!!!所以最坏的情况却配上了"最好的情况",这样相互抵消一点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>

using namespace std;
const int maxn = 2e5+100;
#define pr(x) cout << #x << " = " << x << " ";
#define prln(x) cout << #x << " = " << x <<endl;
//#define ll long long

int a[maxn], l[maxn], r[maxn];
map<int,int> mp;
bool dfs(int ll, int rr) {
    if(ll >= rr) return true;
    int maxd = (rr - ll + 1) /2;
    for(int d = 0; d <= maxd; ++d) {
        if(l[ll+d] < ll && r[ll+d] > rr)
            return dfs(ll, ll + d -1) && dfs(ll + d + 1, rr);
        if(l[rr-d] < ll && r[rr-d] > rr)
            return dfs(ll, rr - d -1) && dfs(rr - d + 1, rr);
    }
    return false;
}
int main(){
#ifdef LOCAL
    freopen("C:\\Users\\User Soft\\Desktop\\in.txt","r",stdin);
  //freopen("C:\\Users\\User Soft\\Desktop\\out.txt","w",stdout);
 #endif
    int t,n; cin >> t;
    while( t-- ) {
        cin >> n;
        mp.clear();
        for(int i = 1; i <= n; ++i){
            scanf("%d", a + i);
            l[i] = -1;
            r[i] = n + 1;
        }
        for(int i = 1; i <= n; ++i) {
            if(mp.count(a[i])) {
                l[i] = mp[a[i]];
                r[l[i]] = i;
            }
            mp[a[i]] = i;
        }
        if(dfs(1,n)) cout << "non-boring" << endl;
        else cout << "boring" << endl;
    }
    return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: