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的值 第二行輸入...