problem a. string master(master.c/cpp/pas)
題目描述
所謂最長公共子串,比如串 a:「abcde」,串 b:「jcdkl」,則它們的最長公共子串為串 「cd」,即長題目大意:兩個字串,任意改動k個字母,使得最長公共子串最長度最長的字串,且在兩個串中都作為連續子串出現過。
給定兩個長度都為 n 的字串,對於字串大師的你來說,求它們的最長公共子串再簡單不過了。
所以現在你有 k 次修改機會,每次你可以選擇其中某個串的某個位置,將其修改成任意字元。
你需要合理使用這 k 次修改機會,使得修改之後兩個串的最長公共子串最長。相信對於字串大師
的你來說,這個問題也難不倒你。
input
第一行包含兩個整數 n, k,分別表示字串的長度和修改次數。
第二行包含乙個長度為 n 的僅由小寫字元構成的字串 s。
第三行包含乙個長度為 n 的僅由小寫字元構成的字串 t。
output
輸出一行乙個整數,即修改完畢之後兩個串的最長公共子串的長度。
k<=n<=300
思路:兩個指標i,j,代表從s串第i個位置開始,t串從第j個位置開始,列舉長度len,求出在兩邊找出的子串在k次修改機會內的最大長度
複雜度:o(n^3)
1 #include2 #include3 #include4 #include5using
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,它們之間通過若干條雙向道路連線。記得開long long!!!記得開long long!!!記得開long long!!!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
①40pts(直接列舉第一二三四個點,判斷是否重複,是否按順序連通——o(n^4))
②70pts(列舉其中的第一二三個點,第四個點個數就是第三個點的度數-1,當然考慮環的情況,如果第三個點和第乙個點連通,要再1 要開long long 比賽的時候因為這個丟掉30分) ——o(n^3)
③100pts(bitset優化,對於每個類似於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,它們之間通過若干條單向道路連線。①20分,直接求就好了位元鎮的交通系統極具特色,除了 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
②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 模數較小是乙個坑點...