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:題是不是出難了?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章