POJ 2887 块状数组

题意:

在字符串中的pos位置插入字符串,询问pos位置的字母是谁

 

思路:

裸的块状数组,第一次写,“借鉴”了别人的,比我自己yy的短多了。。。

自己yy的又长又臭,效率还低,就给出别人的吧。。

 

PS:真心觉得块状数组是个好东西。。。

 

View Code
 1 #include <cstdio>

 2 #include <cmath>

 3 #include <cstring>

 4 #include <cstdlib>

 5 #include <algorithm>

 6 #include <iostream>

 7 

 8 #define N 5000

 9 

10 using namespace std;

11 

12 struct BK

13 {

14     int size,next;

15     char s[N];

16     void push(char str)

17     {

18         s[size++]=str;

19     }

20     void insert(int pos,char str)

21     {

22         for(int i=size++;i>pos;i--) s[i]=s[i-1];

23         s[pos]=str;

24     }

25 }bk[N];

26 

27 char a[4000000];

28 int lena,m,bsize,cnt;

29 

30 void read()

31 {

32     gets(a);

33     lena=strlen(a);

34     scanf("%d",&m);

35     bsize=(int)sqrt((double)(lena+m));

36     cnt=0;

37     bk[cnt].size=0;

38     for(int i=0;i<lena;i++)

39     {

40         if(bk[cnt].size==bsize)

41         {

42             bk[cnt].next=cnt+1;

43             bk[++cnt].size=0;

44         }

45         bk[cnt].push(a[i]);

46     }

47     bk[cnt].next=-1;

48 }

49 

50 void updata(int u)

51 {

52     if(bk[u].size<2*bsize) return;

53     ++cnt;

54     int i,j,k=bk[u].size;

55     for(i=bsize,j=0;i<k;i++,j++) bk[cnt].s[j]=bk[u].s[i];

56     bk[cnt].size=j;

57     bk[u].size=bsize;

58     bk[cnt].next=bk[u].next;

59     bk[u].next=cnt;

60 }

61 

62 void go()

63 {

64     for(int i=1,pos,j;i<=m;i++)

65     {

66         scanf("%s",a);

67         if(a[0]=='Q')

68         {

69             scanf("%d",&pos);

70             for(j=0;pos>bk[j].size;j=bk[j].next) pos-=bk[j].size;

71             printf("%c\n",bk[j].s[pos-1]);

72         }

73         else 

74         {

75             scanf("%s%d",a,&pos);

76             for(j=0;pos>bk[j].size&&bk[j].next!=-1;j=bk[j].next) pos-=bk[j].size;

77             bk[j].insert(min(pos-1,bk[j].size+1),a[0]);

78             updata(j);

79         }

80     }

81 }

82 

83 int main()

84 {

85     read();

86     go();

87     return 0;

88 }

 

 

你可能感兴趣的:(poj)