POJ2887(块状链表)
Big String
Time Limit: 1000MS | Memory Limit: 131072K | |
Total Submissions: 6346 | Accepted: 1525 |
Description
You are given a string and supposed to do some string manipulations.
Input
The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed 1,000,000.
The second line contains the number of manipulation commands N (0 < N ≤ 2,000). The following N lines describe a command each. The commands are in one of the two formats below:
- I ch p: Insert a character ch before the p-th character of the current string. If p is larger than the length of the string, the character is appended to the end of the string.
- Q p: Query the p-th character of the current string. The input ensures that the p-th character exists.
All characters in the input are digits or lowercase letters of the English alphabet.
Output
For each Q command output one line containing only the single character queried.
Sample Input
ab 7 Q 1 I c 2 I d 4 I e 2 Q 5 I f 1 Q 3
Sample Output
a d e
标准块状链表.
#include"cstdio" #include"cstring" #include"cmath" #include"algorithm" using namespace std; const int MAXN=1005; char str[MAXN*MAXN]; struct Block_List{ int size,next; char s[2*MAXN]; Block_List() { memset(s,0,sizeof(s)); size=0; next=-1; } void push(char ch) { s[size++]=ch; } void insert(int pos,char ch) { for(int i=size;i>pos;i--) { s[i]=s[i-1]; } s[pos]=ch; size++; } }bkl[MAXN]; int bsize,cnt,m; void Init() { gets(str); scanf("%d",&m); bsize=(int)sqrt(double(strlen(str)+m)); for(int i=0;str[i];i++) { if(bkl[cnt].size==bsize) { bkl[cnt].next=cnt+1; cnt++; } bkl[cnt].push(str[i]); } cnt++; } void Update(int u) { if(bkl[u].size<2*bsize) return ; /* for(int i=bsize;i<bkl[u].size;i++) { bkl[cnt].push(bkl[u].s[i]); } */ strcpy(bkl[cnt].s,bkl[u].s+bsize); bkl[cnt].size=strlen(bkl[u].s)-bsize; bkl[u].size=bsize; bkl[cnt].next=bkl[u].next; bkl[u].next=cnt; cnt++; } void handle() { int cas=0; while(++cas<=m) { char op[5]; scanf("%s",op); if(op[0]=='Q') { int pos; scanf("%d",&pos); int i; for(i=0;pos>bkl[i].size;i=bkl[i].next) { pos-=bkl[i].size; } printf("%c\n",bkl[i].s[pos-1]); } else { char ch[5]; int pos; scanf("%s%d",ch,&pos); int i; for(i=0;pos>bkl[i].size&&bkl[i].next!=-1;i=bkl[i].next) { pos-=bkl[i].size; } bkl[i].insert(pos-1,ch[0]); Update(i); } } } int main() { Init(); handle(); return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步