寒假集訓系列DAY 1

2022-05-25 03:21:14 字數 4965 閱讀 5463

problem a. string master(master.c/cpp/pas)

題目描述

所謂最長公共子串,比如串 a:「abcde」,串 b:「jcdkl」,則它們的最長公共子串為串 「cd」,即長

度最長的字串,且在兩個串中都作為連續子串出現過。

給定兩個長度都為 n 的字串,對於字串大師的你來說,求它們的最長公共子串再簡單不過了。

所以現在你有 k 次修改機會,每次你可以選擇其中某個串的某個位置,將其修改成任意字元。

你需要合理使用這 k 次修改機會,使得修改之後兩個串的最長公共子串最長。相信對於字串大師

的你來說,這個問題也難不倒你。

input

第一行包含兩個整數 n, k,分別表示字串的長度和修改次數。

第二行包含乙個長度為 n 的僅由小寫字元構成的字串 s。

第三行包含乙個長度為 n 的僅由小寫字元構成的字串 t。

output

輸出一行乙個整數,即修改完畢之後兩個串的最長公共子串的長度。

k<=n<=300

題目大意:兩個字串,任意改動k個字母,使得最長公共子串最長

思路:兩個指標i,j,代表從s串第i個位置開始,t串從第j個位置開始,列舉長度len,求出在兩邊找出的子串在k次修改機會內的最大長度

複雜度:o(n^3)

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 inline int

read()

9while(isdigit(chr))

10return ans*f;11}

12void write(int

x)17

const

int n=301;18

char

s[n],t[n],ts[n],tt[n];

19int

n,k,f[n][n];

20 inline int check(char *s,char *t)ans=max(ans,len-1

);30 }return

ans;

3132}33

intmain()

problem b. tourist attractions(tour.c/cpp/pas)

題目描述

在美麗的位元鎮一共有 n 個景區,編號依次為 1 到 n,它們之間通過若干條雙向道路連線。

byteasar 慕名來到了位元鎮旅遊,不過由於昂貴的門票費,他只能負擔起 4 個景區的門票費。他可

以在任意景區開始遊覽,然後結束在任意景區。

byteasar 的旅遊習慣比較特殊,一旦他路過了乙個景區,他就一定會進去參觀,並且他永遠不會參

觀同乙個景區兩次。所以他想知道,有多少種可行的旅遊路線,使得他可以恰好參觀 4 個景區呢?即,

有多少條簡單路徑恰好經過了 4 個點。

input

第一行包含兩個整數 n,表示景區的總數。

第 2 至第 n + 1 行,每行乙個長度為 n 的 01 字串,第 i + 1 行第 j 個字元為 0 表示 i 和 j 之間

沒有道路,為 1 表示有一條道路。

輸入資料保證 (i, j) 的連線情況等於 (j, i) 的連線情況,且 (i, i) 恒為 0。

output

輸出一行乙個整數,即可行的路線總數。

n<=1500

記得開long long!!!記得開long long!!!記得開long long!!!

40pts(直接列舉第一二三四個點,判斷是否重複,是否按順序連通——o(n^4))

70pts(列舉其中的第一二三個點,第四個點個數就是第三個點的度數-1,當然考慮環的情況,如果第三個點和第乙個點連通,要再1   要開long long 比賽的時候因為這個丟掉30分) ——o(n^3)

100ptsbitset優化,對於每個類似於a-b-c-d的四元組我們列舉中間的倆元素b-c

然後對於這一組元素對答案的貢獻為(du[b]-1)*(du[c]-1)-包含b-c這組元素的三元環個數

列舉三元環的個數 ,其中兩個元素b-c已經確定,只要再找乙個元素x同時滿足x-b連通 且x-c連通即可

然而找到元素x最簡單的方法即o(n) 列舉,但是這樣的話時間複雜度重新退化為o(n^3)

於是考慮bitset優化, 假設與b相連的元素集合為s[b],

則三元環個數即為(s[b]&s[c]).count()(兩集合並集中1的個數,即同時與b,c相連)——o(n^3/32)

本題對於pascal選手還是不太友好的,但手動bitset也不是不可以/滑稽

1 #include2 #include3 #include4 #include5 #include6

#define int long long //

懶人專用

7using

namespace

std;

8 inline int

read()

11while(isdigit(chr))

12return ans*f;13}

14void write(int

x)19

int n,a[1505][1505],du[1505

];20

char s[1505

];21

long

long ans=0

;22 bitset<1505> ss[1505

];23

signed main()

32if(n<=50)//

①40pts,這裡碼風可能不太友好(考試的時候為了卡常)當然了,如果100分方法看懂了可以略過前兩種部分分的方法

33for(register int i=1;i<=n;++i)

34for(register int j=1;j<=n;++j)}}

37else

if(n<=300)49

}50 }else61}

62write(ans);

63return0;

64 }

problem c. walk(walk.c/cpp/pas)

考試妥妥的打暴力系列

在位元鎮一共有 n 個街區,編號依次為 1 到 n,它們之間通過若干條單向道路連線。

位元鎮的交通系統極具特色,除了 m 條單向道路之外,每個街區還有乙個編碼 vali,不同街區可能

擁有相同的編碼。如果 vali and valj = valj,即 vali 在二進位制下與 valj 做與運算等於 valj,那麼也會

存在一條額外的從 i 出發到 j 的單向道路。

byteasar 現在位於 1 號街區,他想知道通過這些道路到達每乙個街區最少需要多少時間。因為位元

鎮的交通十分發達,你可以認為通過每條道路都只需要 1 單位時間。

input

第一行包含兩個正整數 n, m,表示街區的總數以及道路的總數。

第二行包含 n 個正整數 val1, val2, ..., valn,分別表示每個街區的編碼。

接下來 m 行,每行包含兩個正整數 ui

, vi,表示一條單向道路,起點為 ui,終點為 vi。

output

輸出 n 行,每行乙個整數,其中第 i 行輸出到達第 i 個街區的最少時間,如果無法到達則輸出 −1

①20分,直接求就好了

②40分,o(n^2)建圖,o(n)bfs求最短路

③70分,考慮重新構圖,新增1<<15個點,列舉子集(o(n^3)),向

點 i 向它所有的子集連一條權值

為 0 的有向邊,然後在向原圖中連回去,可能表達不太對,畫個圖意會一下//待會兒fft來說又怪語文老師

④100分,還是新建圖,點i 只需要向點 i 去掉某一位的 1 的點連邊,這樣邊的數量得到有效控制

1

#pragma gcc optimize(2)

2 #include3 #include4 #include5 #include6 #include7

#define ll long long

8using

namespace

std;

9 inline int

read()

12while(isdigit(chr))

13return ans*f;14}

15void write(int

x)20

const

int n=1300005;21

intval[n],cnt;

22int n,m,ver[n<<1],head0[n<<1],head1[n<<1],nxt[n<<1],dis[n<<1],tot=0,x,y,hd=1,tl=0

,q[n];

23bool vis[n<<1

];24 inline void add1(int x,int y)

25 inline void add0(int x,int y)

26void run(int x,int

w)33

intmain()

2018寒假福州集訓記Day1

哦 今天上午直接一波考試。之前1個月都在準備期末考試,資訊書都沒翻過,考試前臨時抱佛腳,然而並沒啥卵用。好了不談了,說說題目吧。t1是一道dp題目 我考完試才知道,考試的時候我也有想過可能與遞推有關 題目給的樣例剛好是兩種極端的情況,一種是每行語句下面都加乙個printf再編譯一遍,另一種是一直二分...

寒假學習day 1

今天學習了python常用的字串操作方法。1.字串的下標 字串的每個組成字元都有對應的下標,如str abc 那麼str 0 a,str 1 b 2.字串的切片 語法 序列 開始位置下標,結束位置下標,步長 注意 1 不包含結束位置下標對應的數,正負整數均可。2 步長為選取間隔正負整數均可,預設步長...

湖南集訓Day1

難度不斷網 斷網 卡特蘭數取模 由於資料範圍小,直接做。考試時斷網。忘記卡特蘭數公式,推錯了只有5分。數學公式要記別每次都現用現搜!include include include using namespace std int f 1007 int n,m,ans intmain 模數較小是乙個坑點...