倉鼠有乙個長度為 n 的字串,但他不小心把這個字串丟掉了。幸運的是,
他曾經記下了這個字串的所有長度為 m 的子串。
請你幫他還原出這個字串。
第一行兩個整數 n,m。接下來 n-m+1 行每行乙個長度為 m 的字串。字符集
為小寫字母。
一行乙個長度為 n 的字串表示答案。保證有解,如果有多組解可以輸出任
意一組。
6 3aba
aababb
babaababb
對於 10%的資料,n<=10。
對於另外 30%的資料,m=2。
對於另外 20%的資料,保證原字串隨機且 m>=200。
對於 100%的資料,2<=m<=n<=100000,nm<=200000。
考場上想到子串前m-1和後m-1和其它子串的關係,想到正解可能是建個圖跑一遍,但是不會,就打了暴力。
暴力即以每個字串為起點,嘗試用子串的前m-1的子串或後m-1的子串進行匹配,如果能拼成長度為n的字串就直接輸出。
正解:我們考慮將乙個子串的後m-1個子串對前m-1個進行建邊,那麼形成的圖一定能生成乙個尤拉路,字串拼出的尤拉路即所求字串,那麼我們統計入讀-出度為1的點為起點,如果找不到的話,說明字串字元全部都一樣這時任選乙個為起點即可。
然後再跑完尤拉路時,倒著輸出就行了。
c od
ecode
code
#include
#define ll long long
#define maxn 5000100
#define n 1001
#define inf 0x3f3f3f3f
#define gtc() getchar()
using
namespace std;
template
<
class
t>
inline
void
read
(t &s)
while
(isdigit
(ch)
) s *
= w;
}template
<
class
t>
inline
void
write
(t x)
map int> mp;
int n, m;
string s[
100010
], st;
int in[maxn]
, cnt =0;
vector <
int> v[
100010];
inline
void
add(string s1, string s2)
bool *** =0;
string ans;
void
dfs(
int x)if(
!***)
else
}int
main()
int num;
for(
int i =
1; i <= cnt;
++i)}if
(num > cnt) num =1;
dfs(num)
;return0;
}
4 21小A模擬賽 T1
description 乙個無限長的01 序列,初始全為0,每次選擇乙個區間 l,r 進行操作,有三種操作 1 l r 將 l,r 中所有元素變成1。2 l r 將 l,r 中所有元素變成0。3 l r 將 l,r 中所有元素異或上1。每次操作後詢問最左邊的0 在哪個位置。input format ...
YCH的模擬賽 T1
括號序列問題,往往就是把左括號看成 1,右括號看成 1,我們只需要保證任意乙個字首大於等於0,且總和為0,就代表是個合法括號序列了。令 f i j 表示當前到第 i 個字元,現在的字首和 j 那麼分三種情況考慮。若第 i 1 個字元是左括號,則能轉移到 f i 1 j 1 若第 i 1 個字元是右括...
11 12 模擬賽T1 加密
有一種不講道理的加密方法是 在字串的任意位置隨機插入字元。相應的,不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。給定原文?和加密後的字串?求?有多少子串可以通過解密得到原文?輸入第一行包含乙個字串?第二行包含乙個字串?輸出一行,包含乙個整數,代表可以通過解密得到原文的?的子串的數量。ab...