POJ 2887 Big String(塊狀鍊錶)

2022-05-18 21:32:46 字數 1387 閱讀 4739

給乙個字串,長度不超過 106,有兩種操作:

1. 在第 i 個字元的前面新增乙個字元 ch

2. 查詢第 k 個位置是什麼字元

操作的總數不超過 2000

好多不同的做法都可以搞

人生第乙個塊狀鍊錶,記錄下

塊狀鍊錶的思想其實挺簡單的,傳統的鍊錶每個節點只記錄乙個字元,塊狀鍊錶的每個節點記錄的是 sqrt(n) 個資訊,乙個長度為 n 的字串就被分成了 sqrt(n) 個。這樣,查詢和插入字元的操作就變成了 sqrt(n)級別的了,對於這題 2000 個操作來講,時間複雜度還能忍受

這題只有插入和查詢操作,所以寫起來非常簡單

不過我不喜歡使用指標搞來稿去的,所以寫的陣列形式的

1 #include 2 #include 3 #include 4

5using

namespace

std;67

const

int n=2000, len=2000;8

9struct

block_list

17} list[n];

18int

head, tot;

1920

void init(char

s) 28

if(s[i]) 32}

33for(int cur=head; cur!=-1; cur=list[cur].next)

34if(list[cur].size==len) split(cur);35}

3637

void split(int

id)

45 list[tot].next=list[id].next;

46 list[id].next=tot++;47}

4849

void insert(int pos, char

val)

55if(pos>=list[cur].size) list[cur].buff[list[cur].size]=val;

56else

60 list[cur].size++;

61if(list[cur].size==len) split(cur);62}

6364

char find(int

pos)

69};

7071

block_list hehe;

72char buff[1000006], s[2

];73

intn;

7475

intmain()

86else90}

91return0;

92 }

poj 2887

poj 2887 big string

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,...

POJ2887 塊狀陣列

1 題意 給出乙個長串,然後給出n個操作,操作有兩種,在某個位置插入乙個字元,或者查詢第x個位置上的字元是什麼 2分析 1 快速輸出第x個位置上的字元,像直接儲存類資料結構中的陣列就可以,但是難在插入乙個字元時,後面所有字元都要動,所以不能用普通的陣列 而如果用鍊錶雖然能解決插入不超時的問題,但是因...