給一個字符串,長度不超過 106,有兩種操做:ios
1. 在第 i 個字符的前面添加一個字符 ch數組
2. 查詢第 k 個位置是什麼字符ide
操做的總數不超過 2000spa
好多不一樣的作法均可以搞3d
人生第一個塊狀鏈表,記錄下指針
塊狀鏈表的思想其實挺簡單的,傳統的鏈表每一個節點只記錄一個字符,塊狀鏈表的每一個節點記錄的是 sqrt(n) 個信息,一個長度爲 n 的字符串就被分紅了 sqrt(n) 個。這樣,查詢和插入字符的操做就變成了 sqrt(n)級別的了,對於這題 2000 個操做來說,時間複雜度還能忍受
code
這題只有插入和查詢操做,因此寫起來很是簡單blog
不過我不喜歡使用指針搞來稿去的,因此寫的數組形式的字符串
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N=2000, LEN=2000; 8 9 struct Block_List { 10 struct Node { 11 char buff[LEN]; 12 int next, Size; 13 void init() { 14 memset(buff, 0, sizeof buff); 15 next=-1, Size=0; 16 } 17 } List[N]; 18 int head, tot; 19 20 void init(char S[]) { 21 head=tot=0; 22 List[tot++].init(); 23 for(int i=0, cur=head; S[i]; cur=List[cur].next) { 24 for(int j=0; j<LEN && S[i]; j++, i++) { 25 List[cur].buff[j]=S[i]; 26 List[cur].Size++; 27 } 28 if(S[i]) { 29 List[tot].init(); 30 List[cur].next=tot++; 31 } 32 } 33 for(int cur=head; cur!=-1; cur=List[cur].next) 34 if(List[cur].Size==LEN) Split(cur); 35 } 36 37 void Split(int id) { 38 List[tot].init(); 39 for(int i=LEN/2; i<LEN; i++) { 40 List[tot].buff[i-LEN/2]=List[id].buff[i]; 41 List[tot].Size++; 42 List[id].buff[i]=0; 43 List[id].Size--; 44 } 45 List[tot].next=List[id].next; 46 List[id].next=tot++; 47 } 48 49 void Insert(int pos, char val) { 50 int cur=head; 51 while(pos>List[cur].Size && List[cur].next!=-1) { 52 pos-=List[cur].Size; 53 cur=List[cur].next; 54 } 55 if(pos>=List[cur].Size) List[cur].buff[List[cur].Size]=val; 56 else { 57 for(int i=List[cur].Size; i>pos; i--) List[cur].buff[i]=List[cur].buff[i-1]; 58 List[cur].buff[pos]=val; 59 } 60 List[cur].Size++; 61 if(List[cur].Size==LEN) Split(cur); 62 } 63 64 char Find(int pos) { 65 int cur=head; 66 while(pos>List[cur].Size) pos-=List[cur].Size, cur=List[cur].next; 67 return List[cur].buff[pos-1]; 68 } 69 }; 70 71 Block_List hehe; 72 char buff[1000006], S[2]; 73 int n; 74 75 int main() { 76 // freopen("in", "r", stdin); 77 scanf("%s", buff); 78 hehe.init(buff); 79 scanf("%d", &n); 80 for(int i=0, pos; i<n; i++) { 81 scanf("%s", buff); 82 if(buff[0]=='I') { 83 scanf("%s%d", S, &pos); 84 hehe.Insert(pos-1, S[0]); 85 } 86 else { 87 scanf("%d", &pos); 88 printf("%c\n", hehe.Find(pos)); 89 } 90 } 91 return 0; 92 }