tem

3、无重复字符的最长子串

我的梦境 提交于 2020-03-09 16:14:17
思路一 储存遍历过的字符串,下一个字符串如果遍历过,则找到储存的位置切片O(n^2) tem = [ ] length = 0 max = 0 for i in s : if i not in tem : tem . append ( i ) length += 1 if length > max : max = length else : index = tem . index ( i ) tem = tem [ ( index + 1 ) : ] tem . append ( i ) length = len ( tem ) if length > max : max = length return max 思路二 1、遍历原字符串 2、已经遍历过的字符放在哈希表中(字典,key是字符,value是index) 3、若新字符已经在hash表中,则取其先出现的index为last(相当于变相对字典切片) class Solution : def lengthOfLongestSubstring ( self , s : str ) - > int : tem = { } length = 0 max = 0 last = - 1 for index , j in enumerate ( s ) : if j in tem and tem [ j ] > last : length

“东信杯”广西大学第一届程序设计竞赛(同步赛)H

懵懂的女人 提交于 2020-02-29 03:29:17
链接: https://ac.nowcoder.com/acm/contest/283/H 来源:牛客网 题目描述 由于临近广西大学建校90周年校庆,西大开始了喜闻乐见的校园修缮工程! 然后问题出现了,西大内部有许许多多的道路,据统计有N栋楼和M条道路 (单向) ,每条路都有“不整洁度”W,现在校方想知道从S楼到T楼的所有路径中,“不整洁度” 乘积最小 是多少。 由于答案可能很大,所以你需要将最后的答案 对 10 9 +7取模 。 输入描述: 第一行为四个整数N、M、S、T,意义如上。 第2至第M+1行每行表示一条道路,有三个整数,分别表示每条道路的起点u,终点v和“不整洁度”W。 输入保证没有自环,可能有重边。 其中W一定是2的整数次幂。 输出描述: 输出一个整数,表示最小的不整洁度之乘积对10 9 +7取模的结果。 若无解请输出 -1 示例1 输入 4 4 1 3 1 2 8 1 3 65536 2 4 2 4 3 16 输出 256解题思路:由于每条路的权值可以转化成2的n次幂,所以权值的乘法可以转化成指数的加法,那么这道题就可以求权值指数和的最小值了,这道题就成最短路的问题了。这里我用了dijkstra求最短路,注意要用优先队列优化。 #include<iostream> #include<cstring> #include<algorithm> #include

HDU4825 Xor Sum(01字典树模板题)

夙愿已清 提交于 2020-02-04 00:39:23
题意: 给一个长度为n的序列,m个询问,每次询问给出一个数字x,问数组中哪个元素与x异或的值最大 思路: 1、我们按照长度为32位的二进制01字符串建树,从高位开始建。将所有数据都建到树中。 2、接下来对于每个查询,同样处理成35位二进制01字符串,对应进行查询,如果当前位子是0,那么尽量往1那边走,同理,如果当前位子是1,那么尽量往0那边走即可。 #include<iostream> #include<algorithm> #include<cstring> const int maxn=1e5+10; using namespace std; struct Tire{ int ch[maxn*32][2],val[maxn*32],sz; void init() { sz=0; memset(val,0,sizeof(val)); memset(ch[0],0,sizeof(ch[0])); } void insert(int x) { int u=0; for(int i=31;i>=0;i--){ int tem=(x>>i)&1; if(!ch[u][tem]) ch[u][tem]=++sz; u=ch[u][tem]; } val[u]=x; } int query(int x) { int u=0; for(int i=31;i>=0;i--){ int tem=

NJUPT 1362 汽车加油行驶问题

廉价感情. 提交于 2020-02-03 05:02:17
嗯。。还是算法复习用到了的,竟然还有OJ上有这道题,所以过了一下 参考是 Candesoft-BLOG 大体思路就是首先分点,记录同一位置不同剩余油量的花费。 int cost[N+1][N+1][K+1]; 然后从起点开始一点一点扩展,分别判断有和没有加油站的情况走到4个方向上是否是更优的花费。有点儿类似Dijkstra最短路的感觉。 上代码 1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 using namespace std; 7 #define ll long long 8 //template<typename T> 9 //inline T min(const T& a, const T& b) { return a < b? a:b;} 10 //template<typename T> 11 //inline T max(const T& a, const T& b) { return a > b? a:b;} 12 13 const int N = 100; 14 const int K = 10; 15 const int dirs[][2] = {{ -1, 0}, {1, 0}, {0, -1}, {0

CCF-2019-12-1

落花浮王杯 提交于 2020-02-01 14:19:47
#include <iostream> using namespace std; struct info { int per; int jmp; } player[4]; int main() { int n; cin >> n; for(int i=0; i<4; ++i) { player[i].per=0; player[i].jmp=0; } for (int i=0,tem=1; i<n; ++i,++tem) { int x = tem; while(x) { if(x%10==7) { x=1; break; } else x /= 10; }//判断数字中是否有数字x if((tem%7==0)||x) { ++player[(tem-1)%4].jmp; --i; } else { player[(tem-1)%4].per = tem; } } for (int i=0; i<4; ++i) cout << player[i].jmp <<endl; return 0; } 来源: CSDN 作者: DeepThoughts 链接: https://blog.csdn.net/qq_41714738/article/details/104130334

HDU1024

时间秒杀一切 提交于 2020-01-14 01:39:55
kuangbin带你飞系列 简单dp A HDU 1024 题意:把一个有n个数的序列,分成不相交的m块,求这m块的和。 思路: 参考此博主后得 假设当前数为第i个,该数有2种可能: 第一种是第i个数接入上一个的那一块中,dp[i] [j]=dp[i] [j-1] +all[i] ; 第二种是第i个数作为新的一块。dp[i] [j] = 前i个数中构成j-1块的最大和+all[i]。 得到代码 #include<bits/stdc++.h> using namespace std; const int inf=1e9; const int max_n=1e6+10; const int max_m=100; int all[max_n]; int dp[max_m][max_n]; int main(void) { int m,n; while(scanf("%d %d",&m,&n)!=EOF) { all[0]=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;++i){scanf("%d",&all[i]);} for(int i=1;i<=m;++i) //计算分成i块 for(int j=i;j<=n;++j) //把前j个分成i块 { dp[i][j]=dp[i][j-1]+all[j]; //第一种情况是:前j-1个已经分为i块

poj3977 折半枚举

懵懂的女人 提交于 2020-01-05 04:43:54
传送门: https://vjudge.net/problem/POJ-3977 题意:给你n数(n<=35),从中选出一个非空子集,使得这个子集的所有元素的值的和的绝对值最小,如果有多组数据满足的话,选择子集元素最少的那个。 这题是从挑战程序设计竞赛来的。就是折半枚举。也就是我先分别枚举前面一半的选不选状态(最多2的17次方,O(能过)),和后面一半的,得到两个子集和的数列。子集要么是只从前面一半选,要么只从后面一半选,要么从前面和后面。前面两种情况可以在枚举的时候搞了。至于最后那种情况,我们可以这样解决:就是先对两个枚举出来的子集和数列排个序,然后枚举第一个数列,对于枚举的第一个数列的子集和sum,我们要让它加上从第二个数列的子集和的绝对值最小,也就是在第二个数列中找-sum。这个由于排过序了,所以可以二分。nlogn,可过。 要注意的地方是:首先,不能是空集,所以每次更新答案前要判断它是否空。 其次:我在找第二个数列找-sum的时候,用lower_bound找到p,但是可能找到的数比-sum大的,所以还要比较一下p-1那个数。具体看代码吧。 还有,这题再次验证了一个定律。就是每当我卡题的时候,只要我说一句“不过hjj××”,这题就一定AC。这题就是最好的证明了。。。。。 1 // Cease to struggle and you cease to live 2

快速求斐波拉契数列

元气小坏坏 提交于 2019-12-05 02:56:36
首先,我先介绍一种 O( \(\sqrt n\) )的算法 平方分割法 首先,我们先计算如下的式子 F[i]=F[i-2]+F[i-1]=F[i-3]+2F[i-2]=2F[i-4]+3F[i-3]...... 这时,我们假设当前为F[i]=a*F[j]+b*F[j-1] 则是不是F[i]=(a+b)*F[j-1]+a*F[j-2 下面就是重点 等等,系数是不是有点眼熟:1,1,2...a,b,a+b 这不正是斐波拉契数列吗? 所以,我们可以得到:F[i]=F[k] F[i-k-1]+F[k+1] F[i-k] 即F[k] F[i]+F[k+1] F[i+1]=F[i+k+1] F[n+k]=F[k] F[n-1]+F[k+1] F[n] F[n+k+1]=F[k] F[n]+F[k+1] F[n+1] F[n+k-1]=F[n+k+1]-F[n+k] 时间复杂度为O(n/k+k),当k= \(\sqrt n\) 时取最小,得出结果O( \(\sqrt n\) ). 代码: #include<cstdio> #include<cmath> # define ll long long void make(ll n,ll &x,ll &y,ll m)////x:Fib[n] ; y:Fib[n+1] ; m:Mod { ll a,b,to[3]={0,1,1}; ////特判 if(n

POJ 2566

被刻印的时光 ゝ 提交于 2019-12-04 22:06:23
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1445 Accepted: 487 Special Judge Description Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration (that must be going through a defiant phase: "But I want to use feet, not meters!"). Each signal seems to come in two parts: a sequence of n integer values and a non-negative integer t. We'll not go into details, but researchers found out that a signal encodes two integer values. These can be found as the lower and upper bound of a subrange of the

python学习-66 面向对象3 - 多态

怎甘沉沦 提交于 2019-12-03 11:04:54
                 多态 1.什么是多态 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同。 举例: class H2O: def __init__(self,type,tem): self.type = type self.tem = tem def turn_ice(self): if self.tem < 0: print('%s,冻成为冰了' % self.tem) elif self.tem >0: print('%s,液化成水了' % self.tem) class Ice(H2O): pass class Water(H2O): pass i1 = Ice('冰',-20) w1 = Water('水',20) def func(obj): obj.turn_ice() func(i1) func(w1) 运行结果: -20,冻成为冰了 20,液化成水了 Process finished with exit code 0 来源: https://www.cnblogs.com/liujinjing521/p/11792534.html