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)最坏的情况出现次数最少,那么二分思想就容易想到了,因为使用二分能最快的到达只含有一个元素情况!!!!所以最坏的情况却配上了"最好的情况",这样相互抵消一点
大致题意:
给你一个字符串,问你他的任一子串是否都包含一个唯一的字符
思路:
看似简单,实际一丁点思路都没有
后面看汝佳的讲解都看了好长时间
大概思路就是,先找一个唯一字符,然后递归这个字符左右两边的字符串,看他们是否满足,知道只含一个元素.但是万一那个唯一元素是最后一个元素呢???这样复杂度就是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; }
相关文章推荐
- WDK-build 添加Listing file type:assembly,Machine Code,and Source
- 条款20:宁以pass-by-reference-to-const替换pass-by-value(Prefer pass-by-reference-to-const to pass-by-value)
- Uva-12166 Equilibrium Mobile
- UITableView使用<1>之自定义UITableViewCell
- UIview 动画实现
- android 学习 在子线程中更新UI
- UIView的一些常用属性
- Xcode Server Tutorials: 3. Prebuild & Postbuild Scripts
- String,StringBuffer与StringBuilder的取舍
- hdu 5412 CRB and Queries
- UI:UITableView表视图
- UI线程阻塞及优化
- UIAlertView+Blocks.h
- 新人与三年经验的交互设计师有多大的差距?
- UI设计师是混哪一块?要做什么?图文结合详解
- 完整的交互设计流程应该是怎样的?
- UI_19 数据持久化(本地存储)
- Week1-3Quick Union
- iOS开发:标签视图控制器(UITabBarController)
- git 出现 The requested URL returned error: 403