bzoj2555 -- 后缀自动机+LCT

构建出后缀自动机后在自动机上找到 str fail 指针构成的树中的位置,子树大小就是答案。
我们可以用LCT维护后缀自动机,添加字符时链上修改就可以了。
时间复杂度 O(|S|log|S|)

代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1200010
int i,j,k,n,m,Num,f[N],Next[N][26],Pre[N],mask,ch[N][2],Len[N],p[N],a[N],Q,Ans,Last=1,M;
char S[N<<2];
bool b[N],r[N];
inline bool Get(int x){
    return ch[f[x]][1]==x;
}
inline void Rev(int x){
    swap(ch[x][0],ch[x][1]);
    r[x]^=1;
}
inline void Add(int x,int y){
    a[x]+=y;
    p[x]+=y;
}
inline void Down(int x){
    if(r[x]){
        Rev(ch[x][0]);
        Rev(ch[x][1]);
        r[x]=0;
    }
    if(p[x]){
        Add(ch[x][0],p[x]);
        Add(ch[x][1],p[x]);
        p[x]=0;
    }
}
inline void Rotate(int x){
    bool d=Get(x);int y=f[x];
    if(b[y])b[x]=1,b[y]=0;else ch[f[y]][Get(y)]=x;
    ch[y][d]=ch[x][d^1];f[ch[y][d]]=y;
    f[x]=f[y];f[y]=x;ch[x][d^1]=y;
}
inline void P(int x){
    if(!b[x])P(f[x]);
    Down(x);
}
inline void Splay(int x){
    for(P(x);!b[x];Rotate(x))
    if(!b[f[x]])Rotate(Get(x)==Get(f[x])?f[x]:x);
}
inline void Access(int x){
    int y=0;
    while(x){
        Splay(x);
        b[ch[x][1]]=1;ch[x][1]=y;b[y]=0;
        y=x;x=f[x];
    }
}
inline void mr(int x){
    Access(x);Splay(x);Rev(x);
}
inline void Link(int x,int y){
    mr(x);f[x]=y;
}
inline void Cut(int x,int y){
    mr(x);Access(y);Splay(y);
    ch[y][0]=f[x]=0;b[x]=1;
}
inline void Extend(int ch){
    int p,x=++Num;
    b[x]=1;
    Len[x]=Len[Last]+1;
    for(p=Last;p&&!Next[p][ch];p=Pre[p])Next[p][ch]=x;
    if(!p)Pre[x]=1,Link(x,1);else{
        int q=Next[p][ch];
        if(Len[p]+1==Len[q])Pre[x]=q,Link(x,q);else{
            int C=++Num;b[C]=1;
            Len[C]=Len[p]+1;Pre[C]=Pre[q];Link(C,Pre[q]);
            memcpy(Next[C],Next[q],sizeof(Next[q]));
            Pre[q]=Pre[x]=C;Cut(q,Pre[q]);Link(q,C);Link(x,C);
            P(q);a[C]=a[q];
            for(;p&&Next[p][ch]==q;p=Pre[p])Next[p][ch]=C;
        }
    }
    Last=x;mr(1);Access(x);Splay(x);Add(x,1);
}
inline int Query(){
    int p=1;
    for(int i=0;i<n;i++)p=Next[p][S[i]-'A'];
    if(!p)return 0;
    Splay(p);
    return a[p];
}
int main(){
    scanf("%d",&Q);
    scanf("%s",S+1);
    n=strlen(S+1);
    for(Num=i=b[1]=1;i<=n;i++)Extend(S[i]-'A');
    while(Q--){
        scanf("%s",S);
        if(S[0]=='Q'){
            scanf("%s",S);n=strlen(S);
            for(mask=M,i=0;i<n;i++){
                mask=(mask*131+i)%n;
                swap(S[mask],S[i]);
            }
            Ans=Query();
            printf("%d\n",Ans);
            M^=Ans;
        }else{
            scanf("%s",S);n=strlen(S);
            for(mask=M,i=0;i<n;i++){
                mask=(mask*131+i)%n;
                swap(S[mask],S[i]);
            }
            for(i=0;i<n;i++)Extend(S[i]-'A');
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值