POJ2887 塊狀陣列

2021-07-24 13:38:01 字數 1888 閱讀 9560

1 題意

給出乙個長串,然後給出n個操作,操作有兩種,在某個位置插入乙個字元,或者查詢第x個位置上的字元是什麼

2分析(1)

快速輸出第x個位置上的字元,像直接儲存類資料結構中的陣列就可以,但是難在插入乙個字元時,後面所有字元都要動,所以不能用普通的陣列;

而如果用鍊錶雖然能解決插入不超時的問題,但是因為是順序儲存類結構,所以不能很快的輸出第x個位置上的字元。

這裡採用塊狀陣列,陣列塊數*每個塊的最大長度》=總的元素+操作個數,即分塊以後,每個塊都有個增大的空間(讓其大於操作個數即可),然後再用乙個sum陣列,統計從第一塊到當前塊的元素的數量,查詢或插入某個元素時,通過輸入的x(第x個),利用遞增的sum陣列進行二分,得到塊號,然後x-sum[cur-1]就得到在該塊內的第幾個,如果查詢就返回查詢結果,如果輸出就只操縱當前快即可。

(2)下面給出兩份**,**一是塊數和塊內元素都從1開始;**二是塊數和快內元素都從0開始,後者要在細節上多處理一下。

(3)易錯點:

①即塊數和塊內元素從0還是1開始。

②init()中,block_num應該是先將輸入的串的長度+操作個數,然後再開方;而不是先將串的長度開方之後再加操作個數。個人認為後者導致runtime error的原因是因為這樣做的話,導致棧溢位(算了一下,如果是上限1m的棧,就很可能會溢位),相當於每個塊的長度都給到最壞情況下需要的長度,而前者只是給每個塊的長度設定為平均情況下需要的長度。具體採用哪一種,應該根據題目給出的資料推一下吧,如果不溢位就用後者,如果溢位,那麼只能用前者。

summary: a.

block_len,即各個塊的最大長度——block中dat的長度:

在最壞情況下=sqrt(str)+n;

在平均情況下=sqrt(str+n); b.

block_num,塊數:

準確講,=(str+n)/block_len

結合a中的平均情況來講,block_num=block_len=sqrt(str+n)、 3

**一#include #include #include #include #include using namespace std;

const int maxn=1010;

int block_len,block_num;//每一塊的長度、塊數

int n;//操作個數

int sum[maxn];

char str[1000010];

void maintain();

struct blocks

void insert(int pos,char zifu)

maintain();

}//void delate(){}

char query(int pos)

}block[maxn];

void maintain()

void init()

for(int i=0;i

**二

#include #include #include #include #include using namespace std;

const int maxn=1010;

int block_len,block_num;//每一塊的長度、塊數

int n;//操作個數

int sum[maxn];

char str[1000010];

void maintain();

struct blocks

void insert(int pos,char zifu)

maintain();

}//void delate(){}

char query(int pos)

}block[maxn];

void maintain()

void init()

for(int i=0;i

Poj 2887 Big String 塊狀陣列

塊狀陣列裸題.把鍊錶和陣列的特性結合起來.各個塊互不影響 包括長度 定位的時候看在哪一塊就可以了.各種複雜度都是 n.include include include define maxn 1000010 define maxm 1001 using namespace std int n,m,k,...

Poj 2887 Big String 塊狀陣列

塊狀陣列裸題.把鍊錶和陣列的特性結合起來.各個塊互不影響 包括長度 定位的時候看在哪一塊就可以了.各種複雜度都是 n.include include include define maxn 1000010 define maxm 1001 using namespace std int n,m,k,...

POJ 2887 能被3,5,7整除的數

時間限制 1000ms 記憶體限制 65536kb 描述輸入乙個整數,判斷它能否被3,5,7整除,並輸出以下資訊 1 能同時被3,5,7整除 直接輸出3 5 7,每個數中間乙個空格 2 能被其中兩個數整除 輸出兩個數,小的在前,大的在後。例如 3 5或者 3 7或者5 7,中間用空格分隔 3 能被其...