hihocoder 1039 字串消除 模擬

2022-06-04 07:09:08 字數 2396 閱讀 3010

題意:給定乙個只由組成的字串s,長度為n, 故包含n+1個空隙;現要求在某個空隙插入乙個來自的字元,然後按照以下「消除規則」對插入後的字串進行消除操作,問最多能消掉幾個字元(包含插入的乙個)。

消除規則:

1. 自左至右掃瞄當前字串,若字元v從某個位置開始連續出現了2次及以上,則此區間內的v全部消除;

2. 重複步驟1直至不再有可消除的字元。

思路:模擬,列舉。

這個題有點像之前資料結構程式設計作業的「祖瑪」一題,同樣是會產生連鎖反應的「消除規則」,不過那道題是給定乙個方案,包含一連串的插入操作,直接用動態鍊錶模擬就好。而這道題要求最佳方案,所以可以列舉所有可能的插入方案,對每個方案都要模擬出消除後的結果。動態申請記憶體顯然不合適,而節點數又固定為n+1,所以我用靜態鍊錶來實現。

有兩個值得注意的地方:

1. 之前以為可以這樣剪枝:在挑選每個位置插入的字元時,只考慮和相鄰字元相同的。然而一直wa。。。感謝這篇題解給出的反例 bbbab 

2. 關於複雜度分析:開始時不敢列舉,總感覺是指數的複雜度,但聽了kirai同學的聚合分析後明白了。簡述如下:

(1)首先有n+1個空隙,每個空隙有3種選擇,故共有3*(n+1)種插入方案;

(2)其次對於每個插入方案,要經歷若干趟掃瞄,而停止掃瞄的標誌為上一趟掃瞄是否發生過消除;

具體地,設第 i 趟掃瞄前字串長度為 m ,由於一趟掃瞄過程中指標不回溯,所以一趟掃瞄花費的時間為線性的,記為t[i] = t(m)。若此趟發生了消除,則字串的長度必然至少減1,故t[i+1] <= t(m-1)。而初始字串長度為n+1,故至多經過n趟掃瞄後,必然達到最終狀態。

至此觀察所有趟掃瞄的時間花費序列t,從t[n]到t[1],呈算術級數,故求和後與末項平方同階,為t(n2)。

(3)總的時間複雜度為o(n2 * 3 * (n+1)) = o(n3)

關於**:debug的時間太長了,需要多寫些模擬題

1 #include 2 #include 3 #include 

4 #include 5 #include 6

#define rep(n) for(int i=0; i

7#define repe(n) for(int i=1; i<=(n); i++)

8#define clear(a, x) memset(a, x, sizeof(a))

9#define fread(fn) freopen((fn), "r", stdin)

10#define pb(a) push_back(a)

11#define sint(x) scanf("%d", &(x))

12using

namespace

std;

13const

int max_c = 105;14

15struct

node

16nodes[max_c];//

靜態鍊錶

20int n;//

節點個數

21int

head;

2223

intt;

24char

s[max_c];

25int

ans;

2627

void reset()

34 nodes[n].next = -1;//

末元的後繼35}

3637

intmain()

3860

//printf("\n");

61while(updated)

77if(discovered)else

86//

printf("delete one cluster\n");

87//

for(int j = nodes[head].next; j != -1; j = nodes[j].next)

90//

printf("\n");91}

92//

93//

for(int j = nodes[head].next; j != -1; j = nodes[j].next)

96//

printf("\n");97}

98 nodes[i].next = nodes[n+1].next;//

刪除插入的[n+1]

99 ans =max(ans, cnt);

100//

printf("ans this %d\n", cnt);

101reset();

102}

103}

104 printf("

%d\n

", ans);

105}

106return0;

107 }

view code

hihocoder 1039 字元消除

小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 a...

Hihocoder 1039 字元消除

小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 a...

hihocoder 1039 字元消除

時間限制 1000ms 單點時限 1000ms 記憶體限制 256mb 小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 c...