如今有点前途的工作有(&#9.6.5.3237 注册码;_&#9.6.5.3237 注册码;)?

POJ3237 Tree - Fatedayt - 博客园
POJ3237 Tree
Time Limit:&5000MS
Memory Limit:&131072K
Total Submissions:&2158
Accepted:&574
Description
You are given a tree with&N&nodes. The tree&s nodes are numbered 1 through&N&and its edges are numbered 1 through&N&& 1. Each edge is associated with a weight. Then you are to execute a series of instructions on the tree. The instructions can be one of the following forms:
CHANGE&i&v
Change the weight of the&ith edge to&v
NEGATE&a&b
Negate the weight of every edge on the path from&a&to&b
Find the maximum weight of edges on the path from&a&to&b
The input contains multiple test cases. The first line of input contains an integer&t&(t&& 20), the number of test cases. Then follow the test cases.
Each test case is preceded by an empty line. The first nonempty line of its contains&N&(N&& 10,000). The next&N&& 1 lines each contains three integers&a,&b&and c, describing an edge connecting nodes&a&and&b&with weight&c. The edges are numbered in the order they appear in the input. Below them are the instructions, each sticking to the specification above. A lines with the word &DONE& ends the test case.
For each &QUERY& instruction, output the result on a separate line.
Sample Input
CHANGE 1 3
Sample Output
3-------------------------------------------------------------题目大意:指定一颗树上有3个操作:询问操作,询问a点和b点之间的路径上最长的那条边的长度;取反操作,将a点和b点之间的路径权值都取相反数;变化操作,把某条边的权值变成指定的值。解体思路:这个思路很明显的路径剖分,完全就是来练写路径剖分的。路径剖分讲的比较好的:。     就是从来没写过,写得蛋疼,洋洋洒洒5400B,代码风格全然丧失,还好没有出大错误,不然改都没法改。
#include &stdio.h&
#include &string.h&
#include &iostream&
#define clr(a,b) memset(a,b,sizeof(a))
const int N=10005,M=60005,inf=0x3f3f3f3f;
int n,eid,head[N],ed[N&&1],val[N&&1],nxt[N&&1];
int fa[N],top[N],dep[N],siz[N],id[N],son[N],nid,w[N],p[N];
int le[M],ri[M],rate[M],lazy[M],flag[M],minn[M],maxx[M];
char s[10];
void addedge(int s,int e,int v){
ed[eid]=e;val[eid]=v;nxt[eid]=head[s];head[s]=eid++;
/*第一次dfs,确定dep,siz,son,fa*/
void dfs1(int s,int f,int d){
fa[s]=f;dep[s]=d;siz[s]=1;son[s]=-1;
for(int i=head[s];~i;i=nxt[i]){
int e=ed[i];if(e==f)
dfs1(e,s,d+1);siz[s]+=siz[e];p[e]=i;
if(son[s]==-1||siz[e]&siz[son[s]])son[s]=e;
/*第二次dfs,确定每条边在线段树中的位置(其实只要重边在线段树
里面就好了,但是为了写代码方便,就把所有的边加到线段树了,但保证
了重链是在一起的)*/
void dfs2(int s,int f){
id[s]=++if(~p[s])w[nid]=val[p[s]];
if(!top[s])top[s]=s;
if(~son[s]){top[son[s]]=top[s];dfs2(son[s],s);}
for(int i=head[s];~i;i=nxt[i])
if(ed[i]!=f&&ed[i]!=son[s])dfs2(ed[i],s);
void build(int l,int r,int rt){
le[rt]=l;ri[rt]=r;int mid=(l+r)&&1;
rate[rt]=1;lazy[rt]=flag[rt]=0;
maxx[rt]=minn[rt]=w[l];
build(l,mid,rt&&1);build(mid+1,r,rt&&1|1);
minn[rt]=min(minn[rt&&1],minn[rt&&1|1]);
maxx[rt]=max(maxx[rt&&1],maxx[rt&&1|1]);
void update(int l,int r,int rt,int a,int b,int c){
if(l==le[rt]&&r==ri[rt]){
if(a==-1){
int k=maxx[rt];maxx[rt]=-minn[rt];
minn[rt]=-k;rate[rt]*=-1;lazy[rt]=-lazy[rt];
if(c)lazy[rt]=maxx[rt]=minn[rt]=0;
lazy[rt]+=b;flag[rt]=1;
maxx[rt]+=b;minn[rt]+=b;
if(le[rt]==ri[rt])
int mid=(le[rt]+ri[rt])&&1;
if(flag[rt]){
update(le[rt],mid,rt&&1,rate[rt],lazy[rt],0);
update(mid+1,ri[rt],rt&&1|1,rate[rt],lazy[rt],0);
rate[rt]=1;lazy[rt]=flag[rt]=0;
if(r&=mid)update(l,r,rt&&1,a,b,c);
else if(l&mid)update(l,r,rt&&1|1,a,b,c);
update(l,mid,rt&&1,a,b,c);update(mid+1,r,rt&&1|1,a,b,c);
minn[rt]=min(minn[rt&&1],minn[rt&&1|1]);
maxx[rt]=max(maxx[rt&&1],maxx[rt&&1|1]);
int query(int l,int r,int rt,int a,int b){
if(l==le[rt]&&r==ri[rt])return max(maxx[rt]*a,minn[rt]*a)+b;
int mid=(le[rt]+ri[rt])&&1;
b+=lazy[rt]*a;a*=rate[rt];
if(r&=mid)return query(l,r,rt&&1,a,b);
else if(l&mid)return query(l,r,rt&&1|1,a,b);
return max(query(l,mid,rt&&1,a,b),query(mid+1,r,rt&&1|1,a,b));
int main(){
freopen("/home/axorb/in","r",stdin);
int T;scanf("%d",&T);
while(T--){
eid=0;clr(head,-1);
scanf("%d",&n);
for(int i=1;i&n;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);addedge(b,a,c);
p[1]=-1;dfs1(1,1,1);
nid=-1;clr(top,0);dfs2(1,1);
build(1,nid,1);
while(scanf("%s",s),s[0]!='D'){
int a,b;scanf("%d%d",&a,&b);
if(s[0]=='N'){
while(a!=b){
int f1=top[a],f2=top[b];
if(f1!=f2){
if(dep[f1]&dep[f2]){
if(f1==a)update(id[f1],id[f1],1,-1,0,0),a=fa[a];
else update(id[f1]+1,id[a],1,-1,0,0),a=f1;
if(f2==b)update(id[f2],id[f2],1,-1,0,0),b=fa[b];
else update(id[f2]+1,id[b],1,-1,0,0),b=f2;
if(dep[a]&dep[b])update(id[b]+1,id[a],1,-1,0,0);
else update(id[a]+1,id[b],1,-1,0,0);
else if(s[0]=='C'){
a=(a-1)&&1;
if(p[ed[a]]!=a)a^=1;
update(id[ed[a]],id[ed[a]],1,1,b,1);
int maxx=-
while(a!=b){
int f1=top[a],f2=top[b];
if(f1!=f2){
if(dep[f1]&dep[f2]){
if(f1==a){
maxx=max(maxx,query(id[f1],id[f1],1,1,0));
maxx=max(maxx,query(id[f1]+1,id[a],1,1,0));
if(f2==b){
maxx=max(maxx,query(id[f2],id[f2],1,1,0));
maxx=max(maxx,query(id[f2]+1,id[b],1,1,0));
if(dep[a]&dep[b])maxx=max(maxx,query(id[b]+1,id[a],1,1,0));
else maxx=max(maxx,query(id[a]+1,id[b],1,1,0));
printf("%d\n",maxx);◆◆◆◆被动元件◆◆◆◆◆◆◆◆◆◆◆◆◆◆配件辅料◆◆◆◆周边设备◆◆◆◆LED照明安防消防共16条相关供应信息推广:型号:低至&&0.43581&/&1出货量&&诚信&&供应商类型全部地区1057KEYSTONEBulk全新原装正品30000MOLEX13+进口连接器8000TE15[连接器、接]N/A汽车连接器只做进口原装现货,假一赔十28304TEConnect假一罚十一只起2周货期13904TE14+全新原装假一赔十2000TE15+[连接器、接]标准包装端子、接插连接器10000KYOCERA87天海外一手货源价格优势原装进口35090FITIPOWER.[电子管].其它电子管◆原装◆1748AMP-Tyco15+代理现货库存-货期1-2周999AMP/TYCO9846专注海外现货12年只做原装50PICO15+SMD原装有量可订1000TEConnect授权代理商特价库存3230ST13+SOP自己货源.薄利多销205INTERSIL0337+SSOP28原装现货9850000SANYO16+[二极管]TO-92专营进口变容二极管全系列,品质保证,长期供应!30000MOLEX15+进口连接器上一页1下一页500000TIsop09+深圳2000ELNA超级、法法拉电容&壹周精选货源(支持在线购买)一站式电子元器件
交易平台筛选结果:找到与相关的结果共&&条条件筛选:现货最低价格精确匹配当天发货当天自提找优惠含税价选择厂商:索引:您最近搜索:大家都在搜:--Redis--工商认证实体认证优势认证市场考核型号厂商批号封装最低价bu406国产2P2011+SOPDIP&2.53微信询价支付服务:商家资质:会员年限:电话:86-755-袁小姐手机:-地址:-发货量:笔发货数据由提供支付服务:商家资质:会员年限:1年周啟翰产研中心-设计部·经理手机:深圳市华强电子交易网络公司地址:深圳市深南中路华强路口华强集团二号楼7楼电话:86-4邮编:518031传真:86-6QQ:296244邮件:3237推荐供应商◆◆会员帐号登录手机号登录用 户 名密  码检测到您已登录洽洽帐号下次自动登录一周两周一个月一年手 机 号动态密码验 证 码记住用户名/密码I◆◆产品名称&&型号厂商封装批号数量本月华强宝出货:笔出货排名:位总出货:笔供货能力:&安全通知我们检测到您正在浏览的搜索页内容已被插件篡改,此插件恶意篡改华强电子网搜索信息,屏蔽部分供应商信息,更改现货标志,若继续使用该插件将导致您造成不必要的损失,为了保障你自身的权益,请您立即卸载该插件,同时我们将追究该插件所有人法律责任,以保障广大客户的利益!如有疑问请联系客服 400-887-3118华强电子网特别声明谁能教我怎样瘦身。(#3237;_#3237;)
谁能教我怎样瘦身。(#3237;_#32...
谁能教我怎样瘦身。(#3237;_#3237;)
共4位网友提供帮助
会员9227299 10:01:41
试试看郑多燕减肥相关信息1.决不可能2.看其他方面条件,才有......怎么样减肥效果最好而且还快,不需要花任何......怎样瘦身是最有效的夏天不吹空调可以减肥吗右臀部疼痛食疗减肥方法腹部肥胖双下鼻甲稍肥大双下肢麻木无力操吧。。
会员9227804 09:59:42
减肥相关信息平时跳绳减肥,到经期该给如何运动?我的身材还好,就是胳膊很粗,也许是因为以......快到夏季了,不知旗人怎样?有谁用过,效果好吗?有无副作用。右臀部疼痛食疗减肥方法腹部肥胖双下鼻甲稍肥大双下肢麻木无力产品效果甚微,副作用大并且极容易反弹,建议合理饮食多运动,如果是局部肥胖最好是通过吸脂瘦身塑形
会员9228256 10:04:50
抹上瘦身精油按摩,每天坚持练减肥相关信息如果减肥的时候,早餐吃什么样早餐比较好,......这几年胖了好多,好想减肥,又不知道什么减......小腿有点粗,有什么让它比较快的瘦下来的办......我是生完小孩以后发胖的应该怎样减肥有什么......右臀部疼痛食疗减肥方法腹部肥胖双下鼻甲稍肥大双下肢麻木无力操
会员9227307 10:03:33
可以的,但是要坚持,同时试试儿茶素,可以清除内脏脂肪,减肥相关信息因为去年我腿骨折!在家床上修养了2个月!......我只手就是瘦不下来,要如何才减去手臂的......请问有用过安必信瘦身小博士的朋友吗用过......怎样才能让自己尽快瘦下来啊~?!谁能帮帮......右臀部疼痛食疗减肥方法腹部肥胖双下鼻甲稍肥大双下肢麻木无力更彻底哦。想要达到最佳效果可以尝试买点绿茶中提取的儿茶素服用。
问减肥营养菜谱
专长:心血管疾病和血液疾病
&&已帮助用户:220893
对于减肥营养菜谱一定要重视你提到的减肥营养菜谱为你解答如下.你好1.南瓜汤:南瓜用电锅蒸熟连皮、连籽一起切成块再以果汁机与坚果、核桃、腰果一起打至浓稠状放进锅中与姜、月桂叶慢煮约2小时让南瓜的香甜味完全释放2.炒黄豆芽:红萝卜、木耳、姜丝下锅爆香再加入黄豆芽、辣椒丝一起炒熟最后洒上少许香菜希望对你有帮助
问鼻腔有痰好难过(&#3237_&#3237)
职称:医生会员
专长:内科、上呼吸道感染
&&已帮助用户:45649
问题分析:根据你提供的材料,考虑是上呼吸道感染导致的不适情况,一般建议服用感冒清热颗粒和板兰根来治疗,不要担心
。,意见建议:多食用新鲜的瓜果蔬菜补充维生素,积极锻炼身体增加机体抵抗力,可经常按摩鼻翼二侧的迎香穴也有一定的缓解作用
问有谁可以教我…
职称:医师
专长:中西医结合
&&已帮助用户:124226
你好朋友可以去相关网站看看,有性教育频道的本网站
问尿完还想尿,有白色分泌物,怎么
职称:医师
专长:太阳穴痛,慢性萎缩性胃炎,急性胃肠炎,急性胃炎,溃疡性结肠炎,十二指肠炎
&&已帮助用户:22596
问题分析:你好!你的症状考虑为是由于泌尿系感染引起的可能性比较大。意见建议:建议你可以服用消炎药物来治疗,多喝水,最好是去医院做下尿常规检查,确定下病因再做治疗比较好。
关注此问题的人还看了AHOI2013 填坑记 【BZOJ , , 3238】 - Tony Fang
AHOI2013 填坑记 【BZOJ , , 3238】
友情提示:BZOJ
(3276权限题)
本题解缺BZOJ 3235 好方的蛇
BZOJ 3233 找硬币
f[i]表示最大面额为i的最小硬币数量,那么转移就是
$f[i] = min \{f[j] - \sum_{j|i} \frac{w[k]}{i}*(\frac{i}{j}-1) \}$
那么我们可以预处理出来i的最小的质因数。然后进行优化即可。
# include &stdio.h&
# include &string.h&
const int M=300010, Ms=51;
int n, w[Ms];
int f[M], maxn, z[M], p[M], pn,
// f[i] 最大面值为i,买所有兔纸花的最少硬币数
// f[i] = min{f[j]-sigma(w[k]/i*(i/j-1))}, j|i
int main() {
scanf(&%d&, &n);
for (int i=1; i&=n; ++i) {
scanf(&%d&, &w[i]);
f[1] += w[i];
if (maxn & w[i]) maxn = w[i];
for (int i=2; i&= ++i) {
if (z[i] == 0) {
for (int j=1; j&=pn && p[j] * i &= ++j) {
z[p[j] * i] = p[j];
if(i % p[j] == 0)
for (int i=2; i&= ++i) f[i] = f[1];
ans = f[1];
for (int i=2; i&= ++i) {
int j = i,
while(j & 1) {
t = f[i/z[j]];
for (int k=1; k&=n; ++k)
t = t - w[k] / i *(z[j] - 1);
if(f[i] & t) f[i] =
while(z[j] == z[j/z[j]]) j = j/z[j];
j = j/z[j];
if(ans & f[i]) ans = f[i];
printf(&%d\n&, ans);
BZOJ 3234 立方体
标号后做三维前缀和然后就可以判断啦
# include &stdio.h&
# include &queue&
bool vis[210][210][210];
int f[210][210][210], n, maxx, maxy,
int dx[]={1,-1,0,0,0,0};
int dy[]={0,0,1,-1,0,0};
int dz[]={0,0,0,0,1,-1};
int ans = 0;
struct bfsn {
int x,y,z;
queue&bfsn&
int main() {
scanf(&%d&, &n);
maxx = maxy = maxz = 0;
for (int i=1, x1, y1, z1, x2, y2, z2; i&=n; ++i) {
scanf(&%d %d %d %d %d %d&, &x1, &y1, &z1, &x2, &y2, &z2);
x1+=2, y1+=2, z1+=2;
x2+=2, y2+=2, z2+=2;
f[x1][y1][z1] ++;
f[x2][y2][z1] ++;
f[x1][y2][z2] ++;
f[x2][y1][z2] ++;
f[x1][y2][z1] --;
f[x2][y1][z1] --;
f[x1][y1][z2] --;
f[x2][y2][z2] --;
maxx = max(maxx, x2);
maxy = max(maxy, y2);
maxz = max(maxz, z2);
for (int i=1; i&=maxx+1; ++i)
for (int j=1; j&=maxy+1; ++j)
for (int k=1; k&=maxz+1; ++k)
f[i][j][k] = f[i][j][k] + f[i-1][j][k] + f[i][j-1][k] + f[i][j][k-1] - f[i-1][j-1][k] - f[i-1][j][k-1] - f[i][j-1][k-1] + f[i-1][j-1][k-1];
for (int i=0; i&=maxx+2; ++i)
for (int j=0; j&=maxy+2; ++j)
for (int k=0; k&=maxz+2; ++k)
if(i==0 || j==0 || k==0 || i==maxx+2 || j==maxy+2 || k==maxz+2) vis[i][j][k] = 1;
begin.x = 1;
begin.y = 1;
begin.z = 1;
q.push(begin);
while(!q.empty()) {
bfsn top = q.front();
if (!vis[top.x][top.y][top.z]) {
if (f[top.x][top.y][top.z]) ++
vis[top.x][top.y][top.z] = 1;
for (int i=0; i&6; ++i) {
s.x = top.x + dx[i];
s.y = top.y + dy[i];
s.z = top.z + dz[i];
q.push(s);
printf(&%d\n&, ans);
BZOJ 3236 作业
一看就是莫队题,随便套一个分块就行啦
# include &stdio.h&
# include &math.h&
# include &algorithm&
int n,m,t,left=1,
int a[100010],cnt[100010],w[100010];
int f[10010],g[10010];
int a1[1000010],a2[1000010];
struct quest {
int l,r,a,b,
bool operator &(const quest &A) const{
if (w[l]==w[A.l]) return r&A.r;
else return l&A.l;
}q[1000010];
inline void xy(int l,int r,int id) {
if(w[l]==w[r]) {
for (int i=l;i&=r;++i) if(cnt[i]) a1[id]+=cnt[i],a2[id]++;
for (int i=w[l]*t-1;i&=l;--i) if(cnt[i]) a1[id]+=cnt[i],a2[id]++;
for (int i=w[r]*t-t;i&=r;++i) if(cnt[i]) a1[id]+=cnt[i],a2[id]++;
for (int i=w[l]+1;i&w[r];++i) a1[id]+=f[i],a2[id]+=g[i];
inline void u(int x) {
++f[w[x]];++cnt[x];
if(cnt[x]==1) g[w[x]]++;
inline void v(int x) {
--f[w[x]];--cnt[x];
if(cnt[x]==0) g[w[x]]--;
int main() {
scanf(&%d%d&,&n,&m);
t=sqrt(n/2);
for (int i=1;i&=n;++i) scanf(&%d&,&a[i]),w[i]=i/t+1;
for (int i=1;i&=m;++i) scanf(&%d%d%d%d&,&q[i].l,&q[i].r,&q[i].a,&q[i].b),q[i].id=i;
sort(q+1,q+m+1);
for (int i=1;i&=m;++i) {
while(right&q[i].r) u(a[++right]);
while(left&q[i].l) v(a[left++]);
while(right&q[i].r) v(a[right--]);
while(left&q[i].l) u(a[--left]);
xy(q[i].a,q[i].b,q[i].id);
for (int i=1;i&=m;++i) printf(&%d %d\n&,a1[i],a2[i]);
BZOJ 3237 连通图
涨姿势啦,cdq重构图+缩点
要学习学习用指针啦
# include &stdio.h&
# include &algorithm&
# include &string.h&
const int M=200010;
struct unionset {
int fa[M], n,
inline void init(int nn) {
for (int i=1; i&=n; ++i) fa[i] =
inline int getf(int x) {
return fa[x] == x ? x : fa[x] = getf(fa[x]);
inline void unions(int x, int y) {
int fx = getf(x), fy = getf(y);
if (fx != fy) fa[fx] = fy, --
inline bool isok() {
return tt == 1;
struct edge {
}e[M*35], *tail =
bool ans[M];
inline int read() {
int s=0,f=1;char ch=getchar();
while(ch&'0'||ch&'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch&='0'&&ch&='9'){s=(s&&1)+(s&&3)+ch-'0';ch=getchar();}
return s*f;
struct quest {
int n, a[5],
}q[M], qt[M*35], *qtail =
int times=0;
bool f[M];
int nE[M], nV[M], g[M];
inline void cdq(int l, int r, int n, int m, edge *last) {
copy(last, tail, e);
for (int i=0; i&m; ++i) f[i] = 0;
for (int i=1; i&=n; ++i) nE[i] = nV[i] = g[i] = 0;
if (l == r) {
for (int i=1; i &= q[l].n; ++i) f[q[l].a[i]] = 1;
t.init(n);
for (int i=0; i&m; ++i) if(f[i] == 0) t.unions(e[i].x, e[i].y);
ans[l] = t.isok();
for (int i=l; i&=r; ++i)
for (int j=1; j&=q[i].n; ++j)
f[q[i].a[j]] = 1;
t.init(n);
for (int i=0; i&m; ++i)
if(f[i] == 0) t.unions(e[i].x, e[i].y);
int V=0, E=0;
for (int i=1; i&=n; ++i) {
g[i] = t.getf(i);
if(i == g[i]) nV[i] = ++V;
for (int i=1; i&=n; ++i)
if(i != g[i]) nV[i] = nV[g[i]];
for (int i=0; i&m; ++i) e[i].x = nV[e[i].x], e[i].y = nV[e[i].y];
for (int i=0; i&m; ++i) if(f[i]) nE[i] = E++;
for (int i=0; i&m; ++i) if(f[i]) e[nE[i]] = e[i];
for (int i=l; i&=r; ++i)
for (int j=1; j&=q[i].n; ++j)
q[i].a[j] = nE[q[i].a[j]];
int mid = l+r&&1, length = mid - l + 1;
quest *lasts =
copy(q+l, q+mid+1, lasts);
cdq(l, mid, V, E, e);
copy(lasts, lasts+length, q+l);
cdq(mid+1, r, V, E, e);
int main() {
n=read(), m=read();
for (int i=0; i&m; ++i) e[i].x=read(), e[i].y=read();
for (int i=0; i&Q; ++i) {
q[i].n=read();
for (int j=1; j&=q[i].n; ++j) q[i].a[j]=read(), q[i].a[j] --;
q[i].id=i;
t.init(n);
cdq(0, Q-1, n, m, e);
for (int i=0; i&Q; ++i)
if(ans[i] == 1) puts(&Connected&);
else puts(&Disconnected&);
BZOJ 3238 差异
看到lcpxi想到SA,然后单调栈乱搞就好啦!
# include &stdio.h&
# include &string.h&
# include &algorithm&
const int M=780010;
int sa[M], sa_t[M], rank[M], rank_t[M], rank_t2[M], cnt[M], h[M], s[M], t[M];
//int minst[M], plog[M];
inline bool cmp(int *t, int a, int b, int l) {
return t[a] == t[b] && t[a+l] == t[b+l];
inline void getsa(int n, int m) {
memset(cnt, 0, sizeof(cnt));
for (int i=0; i&n; ++i) ++cnt[rank_t[i] = s[i]];
for (int i=1; i&m; ++i) cnt[i] += cnt[i-1];
for (int i=n-1; i&=0; --i) sa[--cnt[s[i]]] =
for (int j=1, p=1; p&n; j&&=1, m=p) {
for (int i=n-j; i&n; ++i) sa_t[p++] =
for (int i=0; i&n; ++i) if(sa[i] &= j) sa_t[p++] = sa[i] -
memset(cnt, 0, sizeof(cnt));
for (int i=0; i&n; ++i) ++cnt[rank_t2[i] = rank_t[sa_t[i]]];
for (int i=1; i&m; ++i) cnt[i] += cnt[i-1];
for (int i=n-1; i&=0; --i) sa[--cnt[rank_t2[i]]] = sa_t[i], t[i] = rank_t[i];
rank_t[sa[0]] = 0;
for (int i=1; i&n; ++i)
rank_t[sa[i]] = cmp(t, sa[i], sa[i-1], j) ? p-1 : p++;
for (int i=0; i&n; ++i) rank[sa[i]] =
inline void geth(int n) {
for (int i=0, k=0; i&n; h[rank[i++]] = k) {
if(rank[i]) {
if(k&0) --k;
for (; s[i+k] == s[sa[rank[i]-1]+k]; ++k);
} else k=0;
char str[M];
int left[M], right[M];
inline void stprepare() {
plog[1] = 0;
for (int i=2; i&=n; ++i) {
plog[i] = plog[i-1];
if((1&&plog[i]) == i) plog[i] ++;
for (int i=0; i&n; ++i) minst[i][0] = h[i];
for (int i=n-1; i&=0; --i)
for (int j=1; i+(1&&j)-1 & ++j)
minst[i][j] = min(minst[i][j-1], minst[i+(1&&(j-1))][j-1]);
inline void query(int l, int r) {
int length = r-l+1;
int k = plog[length];
return min(minst[l][k], minst[r-(1&&k)+1][k]);
int st[M*2], stn=0;
int hi[M];
int main() {
scanf(&%s&, str);
n = strlen(str);
ans = 1LL*n*(n+1)*(n-1)/2;
for (int i=0; i&n; ++i) s[i] = str[i];
getsa(n+1, 256);
geth(n+1);
stn=0; st[stn++] = 1;
for (int i=1; i&=n; ++i) {
while(stn && h[st[stn-1]] & h[i]) stn--;
if(stn) left[i] = st[stn-1] + 1;
else left[i] = 1;
st[stn++] =
stn=0; st[stn++] =
right[n] =
for (int i=n; i&=1; --i) {
while(stn && h[st[stn-1]] &= h[i]) stn--;
if(stn) right[i] = st[stn-1] - 1;
else right[i] =
st[stn++] =
long long del=0;
for (int i=2; i&=n; ++i)
del+=2LL*h[i]*(i-left[i]+1)*(right[i]-i+1);
printf(&%lld\n&, ans);
当有新评论通过 E-mail 通知我
(输入验证码)
or Ctrl+Enter

我要回帖

更多关于 uiso9.6.5.3237注册码 的文章

 

随机推荐