輸入包含多組資料。每組資料佔一行,包含不超過100000個字母、下劃線、字元「[」或
者「]」。其中字元「[」表示home鍵,「]」表示end鍵。輸入結束標誌為檔案結束符(eof)。輸
入檔案不超過5mb。對於每組資料,輸出一行,即螢幕上的悲劇文字。
//樣例輸入:
this_is_a_[beiju]_text
//樣例輸出:
beijuthis_is_a__text
【分析】
最簡單的想法便是用陣列來儲存這段文字,然後用乙個變數pos儲存「游標位置」。這
樣,輸入乙個字元相當於在陣列中插入乙個字元(需要先把後面的字元全部右移,給新字元
騰出位置)。
很可惜,這樣的**會超時。為什麼?因為每輸入乙個字元都可能會引起大量字元移
動。在極端情況下,例如,2500000個a和「[」交替出現,則一共需要0+1+2+…+2499999=6*10 12次字符移動。**
解決方案是採用鍊錶(linked list)。每輸入乙個字元就把它存起來,設輸入字串是
s[1~n],則可以用next[i]表示在當前顯示屏中s[i]右邊的字元編號(即在s中的下標)(1)。
提示6-3:在陣列中頻繁移動元素是很低效的,如有可能,可以使用鍊錶。
為了方便起見,假設字串s的最前面還有乙個虛擬的s[0],則next[0]就可以表示顯示屏
最左邊的字元。再用乙個變數cur表示游標位置:即當前游標位於s[cur]的右邊。cur=0說明
游標位於「虛擬字元」s[0]的右邊,即顯示屏的最左邊。
對於這種游標的, 一般理解都是一步一步除錯, 從而慢慢了解思路
源**如下:
#include#include
#include
const int maxn = 100000 + 5;
intlast, cur, next[maxn]; //游標位於cur號字元的後面
char s[maxn];
int main()
}
for(int i = next[0]; i != 0; i = next[i])
printf("%c", s[i]);
printf("\n");
} system("pause");
return
0; }
一道演算法題
兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...
一道演算法題
1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...
一道演算法題
include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...