11 06 模擬賽T1 字串

2021-09-29 09:31:11 字數 1690 閱讀 2816

倉鼠有乙個長度為 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...