SDUT OJ 2615 傳紙條(棧的應用)

2021-09-23 15:46:03 字數 2417 閱讀 6946

problem description

傳紙條是一種在課堂上傳遞資訊的老方法,雖然現在手機簡訊和qq聊天越來越普及,但是手寫的資訊會讓人感到一種親切感。對許多學生而言,在學校裡傳遞一些私秘性的資訊是一種令人興奮的打發時光的方式,特別是在一些令人厭煩的課堂上。

xx 和 yy 經常在自習課的時候傳紙條來傳遞一些私密性的資訊。但是他們的座位相隔比較遠,傳紙條要通過其他人才能到達對方。在傳遞過程中,難免會有一些好奇心比較強的同學偷看紙條的內容。所以他們想到了乙個辦法,對紙條內容進行加密。

加密規則很簡單:多次在資訊的任意位置隨意的新增兩個相同的字母。

由於使用英文交流顯得比較高階,所以他們的紙條內容只有英文。

現在給你加密後的資訊,請你還原出原始的內容。

input

輸入資料的第一行為乙個正整數 t(t ≤ 30),表示共有 t 組測試資料。

接下來 t 行,每行為乙個字串,字串僅包含小寫英文本母,且保證原始字串中不包含相鄰兩個相同的字母,字串長度不超過200000。

output

每組資料輸出一行字串,表示還原後的內容。

sample input

1

ssilofaafveuuu

sample output

iloveu
這個題如果直接想的話就是用std::string配套上erase(loc1,length)這種比較便捷的stl模板及其函式。但是這樣做會超時,親測。這類似於python的儲存資料結構,每刪除乙個字元都會使得後面的字元全體前移乙個格,這就造成了極大的時間消耗,所以在這個題的資料範圍下不能用std::string。

那麼可以考慮用棧這個資料結構來實現比對「已儲存的當前字元」與「遍歷指標指向的字串當前字元」是否相符來進行篩選。詳細點說就是假如棧頂的字元與當前訪問到的字元是同乙個字元,那麼,把棧頂指標下移,驅逐出當前字元(這裡為了輸出方便用陣列模擬),如果是不同字元,那麼就把字串上的這個字元壓入棧中。

但是如果光移動棧頂指標的話會出現乙個問題:如果最後棧裡邊本來應該被刪除的字元在之後的過程中沒有被覆蓋(因為按照正常想法是直接彈出,而陣列模擬時沒有彈出,只是暫時無視了而已),那麼會導致答案錯誤。

對於這樣的乙個細節有兩種處理辦法,一種是直接空字元賦值覆蓋掉需要彈出的字元,另一種是輸出時僅輸出棧底到棧頂長度的字元,而不是整個字元陣列的模擬棧中的所有字元了。

所以有如下思路:

**如下: 

構建模擬棧

遍歷字串,依據題給關係進行新增與刪除

根據上面處理方式的不同來選擇輸出方式

**如下:

#include#include #include #include #include #include #include #include #include #include #define determination main

#define lldin(a) scanf_s("%lld", &a)

#define println(a) printf("%lld\n", a)

#define reset(a, b) memset(a, b, sizeof(a))

const int inf = 0x3f3f3f3f;

using namespace std;

const double pi = acos(-1);

typedef long long ll;

typedef unsigned long long ull;

typedef long double ld;

const int mod = 1000000007;

const int tool_const = 19991126;

const int tool_const2 = 33;

inline ll lldcin()

while (c >= '0' && c <= '9')

return si * tmp;

}///untersee boot vixd(1942)

/**although there will be many obstructs ahead,

the desire for victory still fills you with determination..**/

/**last remote**/

char s[500000];

char sta[500000];

int determination()

else

//cout << sta[pointer] << endl;

} for (int i = 1; i <= pointer; i++)

cout << sta[i];//如果在上面有處理,那麼直接輸出即可

cout << endl;

} return 0;

}

ZOJ 2615 用棧模擬dfs

zoj 2615整整弄了兩天,雖然說題目意思很簡單,就是dfs。但是由於資料過大,不得不採取用棧去模擬dfs的方法,下面做一下總結 題目大意就是給你兩個數,詢問前乙個數是否為後乙個數的祖先,在做題過程中,由於查詢次數過多,所以借鑑了網上的思路,用出入棧次序去判斷。如下 基本思路 在模擬dfs過程中子...

洛谷 2615 神奇的幻方

首先將 1 寫在第一行的中間。若 k 1 在第一行但不在最後一列,則將 k 填在最後一行,k 1 所在列的右一列 若 k 1 在最後一列但不在第一行,則將 k 填在第一列,k 1 所在行的上一行 若 k 1 在第一行最後一列,則將 k 填在 k 1 的正下方 若 k 1 既不在第一行,也最後一列,如...

數列求和 sdut oj

time limit 1000ms memory limit 32768kb problem description 數列求和是一類常見的問題,本題有一定的代表性 求s a aa aaa aaaa aa aa n位 其中,a的值由鍵盤輸入,位數n也由鍵盤輸入。input 第一行輸入a的值 第二行輸入...