jtq的笔 && pb的苦恼

Powered by:AB_IN 局外人

jtq的笔

单纯的模拟。
题目什么意思呢?
求字符串中一个非前缀子串恰好为字符串的前缀的最大长度。
下面是简单的模拟

t=int(input())
while t>0:
    t-=1
    s=input();ans=0
    for i in range(len(s)):
        tmp=s[:i+1]
        if tmp in s[1:]:
            ans=len(tmp)
    print(ans)

但如果数据到了10个1e5长的串,一定会tle。
那么我们就得减少复杂度。
符合的不管他,不符合的停住,看不符合的前一个。

正规代码如下。

i = int(input())
while i>0:
    i-=1
    x = input()
    for j in range(1,len(x)+1):
        if x.find(x[0:j],1,len(x))==-1 or j==len(x):
            print(j-1)
            break

pb的苦恼

去除不必要的站点什么意思呢? 就是站点去重罢了。
至少多少个座位呢? 就是保证最大值即可。

题目就是模拟上下车而已。把全从a上车的,下车的,都计数,和状态量取最大值即可。

t=int(input());s=set();d=dict()
while t>0:
    s.clear();ans=0;d.clear();cnt=0
    t-=1
    n=int(input())
    for i in range(n):
        a,b=map(int,input().split())
        s.add(a);s.add(b)
        try:
            d[a]+=1
        except:
            d.setdefault(a,1)
        try:
            d[b]-=1
        except:
            d.setdefault(b,-1)
    a=sorted(d.items())#变成全是元组的列表
    for i in a:
        cnt+=i[1]
        ans=max(ans,cnt)
    a.clear()
    print(len(s),ans)

这里考一些set dict list的综合运用。
普及一下不太熟悉的dict

  1. dict.get(key, default=None)
    key – 字典中要查找的键。
    default – 如果指定键的值不存在时,返回该默认值。
    返回指定键的值,如果值不在字典中返回默认值None。
    比如d.get(3,0)如果键值3不存在,则返回0.
  2. dict.items()
    返回可遍历的(键, 值) 元组数组。
  3. dict.setdefault(key, default=None)
    key – 查找的键值。
    default – 键不存在时,设置的默认键值。
    如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
    比如d.setdefault(a,1),如果键值a不存在,就赋值1。一般配合try break食用更加哦。

下面是一个差点tle的代码。

t=int(input());s=set();up=dict();down=dict()
while t>0:
    s.clear();up.clear();down.clear();ans=0;cnt=0
    t-=1
    n=int(input())
    for i in range(n):
        a,b=map(int,input().split())
        s.add(a);s.add(b)
        try:
            up[a]+=1
        except:
            up.setdefault(a,1)
        try:
            down[b]+=1
        except:
            down.setdefault(b,1)
    ans=0
    #下面四行是对up和down字典根据键排序。
    tmp1=sorted(up.items(), key=lambda x: x[0])
    new_up = {i[0]: i[1] for i in tmp1}
    tmp2=sorted(down.items(), key=lambda x: x[0])
    new_down = {i[0]: i[1] for i in tmp2}
    lst=list(sorted(s))
    for i in lst:
        ans+=new_up.get(i,0);ans-=new_down.get(i,0)
        cnt=max(cnt,ans)
    print(len(s),cnt)

因为这个题的原型还是个c++设计的,所以都得排序从头开始。
py里字典添加值是不会随时排序的,这和c++的map不同。map运用迭代器,会从最小的键开始。
py里集合也不会随时排序

所以正规c++代码

#include <bits/stdc++.h>
using namespace std;
int T, n, a[100005], b[100005];
set<int> s;
map<int, int> up, down;
int ans1, ans2,t;
int main() {
    scanf("%d", &T);
    while(T--) {
        ans1=0; ans2=0;t=0;
        s.clear(); up.clear(); down.clear();
        scanf("%d", &n);
        for (int i=1; i<=n; ++i) {
            scanf("%d%d", &a[i], &b[i]);
            s.insert(a[i]); s.insert(b[i]);
            up[a[i]]++; down[b[i]]++;
        }
        for (auto it=s.begin(); it!=s.end(); ++it) {
            t+=up[*it]; t-=down[*it];
            ans2=max(ans2, t);
        }
        ans1=s.size();
        printf("%d %d\n", ans1, ans2);
    }
    return 0;
}

完结。
ps:题是不是出难了?

扫描二维码关注公众号,回复: 11402219 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_45859188/article/details/106594025