bzoj1014: [JSOI2008]火星人prefix splay+hash

我写的代码好像自古以来就是bzoj不友好型的

本地跑的比std快,但是交上去巧妙被卡

答案。。。应该是对的,拍了好久了

  1 #include <bits/stdc++.h>
  2 #define MOD 998244353
  3 #define mid (l+r>>1)
  4 using namespace std;
  5 int n,m,x,y;char ch;
  6 long long mi[300001];
  7 struct spla
  8 {
  9     int c[300001][2],fa[300001],ch[300001],size[300001],ha[300001];
 10     int rt,cnt;
 11     void up(int now)
 12     {
 13         size[now]=size[c[now][0]]+size[c[now][1]]+1;
 14         ha[now]=(ha[c[now][0]]+mi[size[c[now][0]]]*ch[now]%MOD+mi[size[c[now][0]]+1]*ha[c[now][1]]%MOD)%MOD;
 15     }
 16     void rot(int x,int &root)
 17     {
 18         int y=fa[x],k=c[y][1]==x;
 19         if(y!=root) c[fa[y]][c[fa[y]][1]==y]=x;
 20         else root=x;
 21         fa[x]=fa[y];
 22         fa[y]=x;
 23         fa[c[x][!k]]=y;
 24         c[y][k]=c[x][!k];
 25         c[x][!k]=y; 
 26         up(y);up(x);
 27     }
 28     void splay(int x,int &root)
 29     {
 30         for(int y=fa[x];x!=root;rot(x,root),y=fa[x])
 31             if(y!=root)
 32             rot(((c[fa[y]][1]==y)^(c[y][1]==x))?x:y,root);
 33     }
 34     void add(int x,int y)
 35     {
 36         ch[++cnt]=y;size[cnt]=1;ha[cnt]=y;
 37         if(!rt)
 38         {
 39             rt=cnt;
 40             return;
 41         }
 42         if(x==0)
 43         {
 44             splay(fin(1),rt);
 45             c[rt][0]=cnt;fa[cnt]=rt;
 46             return;
 47         }
 48         splay(fin(x),rt);
 49         if(x==n)
 50             c[rt][1]=cnt,fa[cnt]=rt;
 51         else
 52             splay(fin(x+1),c[rt][1]),c[c[rt][1]][0]=cnt,fa[cnt]=c[rt][1];
 53     }
 54     /*
 55     void add(int x,int y)
 56     {
 57         ch[++cnt]=y;size[cnt]=1;ha[cnt]=y;
 58         if(!rt)
 59         {
 60             rt=cnt;
 61             return;
 62         }
 63         int now=rt;
 64         while(1)
 65         {
 66             if(x>size[c[now][0]])
 67                 if(c[now][1]) x-=size[c[now][0]]+1,now=c[now][1];
 68                 else
 69                 {
 70                     c[now][1]=cnt;fa[cnt]=now;
 71                     splay(cnt,rt);
 72                     return;
 73                 }
 74             else
 75                 if(c[now][0]) now=c[now][0];
 76                 else
 77                 {
 78                     c[now][0]=cnt;fa[cnt]=now;
 79                     splay(cnt,rt);
 80                     return;
 81                 } 
 82         }
 83     }*/ 
 84     int fin(int x)
 85     {
 86         int now=rt;
 87         while(x>1 || c[now][0])
 88         {
 89             if(x==size[c[now][0]]+1)
 90                 break;
 91             if(x>size[c[now][0]])
 92                 x-=size[c[now][0]]+1,now=c[now][1];
 93             else
 94                 now=c[now][0];
 95         }
 96         return now;
 97     }
 98     void change(int x,int y)
 99     {
100         int now=fin(x);
101         splay(now,rt);
102         ch[now]=y;
103         up(now);
104     }
105     int hash(int x,int y)
106     {
107         if(x==1 && y==n) return ha[rt];
108         if(x==1)
109         {
110             splay(fin(y+1),rt);
111             return ha[c[rt][0]]; 
112         }
113         if(y==n)
114         {
115             splay(fin(x-1),rt);
116             return ha[c[rt][1]];
117         }
118         splay(fin(x-1),rt);
119         splay(fin(y+1),c[rt][1]);
120         return ha[c[c[rt][1]][0]];
121     }
122 } sp;
123 inline int read()
124 {
125     char ch=getchar();
126     for(;!isdigit(ch);ch=getchar());
127     int re=0;
128     bool fl=1;
129     if (ch=='-')
130     {
131         re=0;
132         ch=getchar();
133     }
134     while (isdigit(ch))
135     {
136         re=re*10+ch-'0';
137         ch=getchar();
138     }
139     return fl?re:-re;
140 }
141 inline void write(int re)
142 {
143     if (re<0)
144     {
145         putchar('-');
146         re=-re;
147     }
148     if (re>9) write(re/10);
149     putchar(re%10+'0');
150 }
151 void work(int x,int y)
152 {
153     if(x>y) swap(x,y);
154     int l=1,r=n-y+2;
155     while(l<r)
156     if(sp.hash(x,x+mid-1)==sp.hash(y,y+mid-1)) l=mid+1;
157         else r=mid;
158     write(l-1);puts("");
159 }
160 int main()
161 {
162     mi[0]=1;
163     for(int i=1;i<=250000;i++)
164         mi[i]=mi[i-1]*233%MOD;
165     for(ch=getchar();isalpha(ch);ch=getchar())
166         sp.add(n,ch-'a'+1),++n;
167     m=read();
168     for(int i=1;i<=m;i++)
169     {
170         for(ch=getchar();!isalpha(ch);ch=getchar());
171         x=read();
172         if(ch=='Q') y=read();
173         else
174         {
175             char cas=ch; 
176             for(ch=getchar();!isalpha(ch);ch=getchar());
177             y=ch-'a'+1;
178             ch=cas;
179         }
180         if(i==7)
181             int e=1;
182         if(ch=='Q') work(x,y);
183         else
184         if(ch=='R')
185             sp.change(x,y);
186         else
187             sp.add(x,y),++n;
188     }
189     return 0;
190  } 
原文地址:https://www.cnblogs.com/wanglichao/p/7267308.html