tsinsenA1484. two strings(罗干)

http://www.tsinsen.com/A1484

  在线插入并不好做,我们将所有操作离线,变为删除操作。

  每次询问的时候对于当前B串所在起始位置及其长度向上向下二分,然后查询区间内合法的当前A串内的匹配点即可。用树状数组维护。

#include<bits/stdc++.h>
using namespace std;
const int maxlen=200015,maxm=200015,maxk=20;
int tmp,sta,eda,stb,edb,len,m,w[maxm];
char a[maxlen*2],b[maxlen*2],s[maxlen];
struct Tbit{
    int T[maxlen];
    void modify(int x,int v){for (int p=x;p<=len;p+=p&-p) T[p]+=v;}
    int query(int l,int r){
        int res=0;
        for (int p=l-1;p>=1;p-=p&-p) res-=T[p];
        for (int p=r;p>=1;p-=p&-p) res+=T[p];
        return res;
    }
}bit;
struct Tsuffix_array{
    int sum[maxlen],sa[maxlen],rank[maxlen],tsa[maxlen],trank[maxlen];
    bool cmp(int i,int j,int l){
        if (i+l>len||j+l>len) return 0;
        return rank[i]==rank[j]&&rank[i+l]==rank[j+l];
    }
    void suffix_sort(){
        int m=255,p,i,j;
        for (i=0;i<=m;++i) sum[i]=0;
        for (i=1;i<=len;++i) ++sum[rank[i]=s[i]];
        for (i=1;i<=m;++i) sum[i]+=sum[i-1];
        for (i=len;i>=1;--i) sa[sum[rank[i]]--]=i;
        for (p=0,j=1;p<len;j<<=1,m=p){
            for (p=0,i=len-j+1;i<=len;++i) tsa[++p]=i;
            for (i=1;i<=len;++i) if (sa[i]>j) tsa[++p]=sa[i]-j;
            for (i=0;i<=m;++i) sum[i]=0;
            for (i=1;i<=len;++i) ++sum[rank[tsa[i]]];
            for (i=1;i<=m;++i) sum[i]+=sum[i-1];
            for (i=len;i>=1;--i) sa[sum[rank[tsa[i]]]--]=tsa[i];
            for (p=trank[sa[1]]=1,i=2;i<=len;++i) trank[sa[i]]=cmp(sa[i],sa[i-1],j)?p:++p;
            memcpy(rank,trank,sizeof(int)*(len+1));
        }
    }
    int height[maxlen];
    void get_height(){
        for (int h=0,i=1;i<=len;++i){
            if (rank[i]==1) continue;
            for (h?--h:0;s[i+h]==s[sa[rank[i]-1]+h];++h);
            height[rank[i]]=h;
        }
    }
    int fmn[maxk][maxlen];
    void prepare(){
        for (int i=2;i<=len;++i) fmn[0][i]=height[i];
        for (int k=1;k<maxk;++k)
            for (int j=1<<k;j<=len;++j)
                fmn[k][j]=min(fmn[k-1][j],fmn[k-1][j-(1<<(k-1))]);
    }
    int LCP(int x,int y){
        if (++x>y) return len-sa[y]+1;
        int k=log2(y-x+1);
        return min(fmn[k][y],fmn[k][x+(1<<k)-1]);
    }
    int calc_up(int pos,int lim){
        int l=1,r=pos,res;
        while (l<=r){
            int mid=(l+r)>>1;
            LCP(mid,pos)>=lim?r=(res=mid)-1:l=mid+1;
        }
        return res;
    }
    int calc_low(int pos,int lim){
        int l=pos,r=len,res;
        while (l<=r){
            int mid=(l+r)>>1;
            LCP(pos,mid)>=lim?l=(res=mid)+1:r=mid-1;
        }
        return res;
    }
    int query(){
        int pos=rank[tmp+stb],lim=edb-stb+1;
        return bit.query(calc_up(pos,lim),calc_low(pos,lim));
    }
}SA;
void init(){
    sta=stb=maxlen;scanf("%s%s%d",a+maxlen,b+maxlen,&m);
    eda=maxlen+strlen(a+maxlen)-1;edb=maxlen+strlen(b+maxlen)-1;
    for (int i=1;i<=m;++i){
        char c[2];scanf("%d",&w[i]);
        switch (w[i]){
            case 1:scanf("%s",c);a[--sta]=c[0];break;
            case 2:scanf("%s",c);a[++eda]=c[0];break;
            case 3:scanf("%s",c);b[--stb]=c[0];break;
            case 4:scanf("%s",c);b[++edb]=c[0];break;
            default:break;
        }
    }
    for (int i=sta;i<=eda;++i) a[i-sta+1]=a[i];a[eda-sta+2]=0;eda=eda-sta+1;sta=1;
    for (int i=stb;i<=edb;++i) b[i-stb+1]=b[i];b[edb-stb+2]=0;edb=edb-stb+1;stb=1;
    for (int i=1;i<=eda;++i) s[++len]=a[i];s[++len]=‘#‘;tmp=len;
    for (int i=1;i<=edb;++i) s[++len]=b[i];s[len+1]=0;
}
vector<int> ans;
void work(){
    SA.suffix_sort();SA.get_height();SA.prepare();
    for (int i=1;i<=eda-edb+1;++i) bit.modify(SA.rank[i],1);
    for (int tim=m;tim>=1;--tim)
        switch (w[tim]){
            case 1:if (eda-sta+1>=edb-stb+1) bit.modify(SA.rank[sta],-1);++sta;break;
            case 2:if (eda-sta+1>=edb-stb+1) bit.modify(SA.rank[eda-(edb-stb+1)+1],-1);--eda;break;
            case 3:++stb;if (eda-sta+1>=edb-stb+1) bit.modify(SA.rank[eda-(edb-stb+1)+1],1);break;
            case 4:--edb;if (eda-sta+1>=edb-stb+1) bit.modify(SA.rank[eda-(edb-stb+1)+1],1);break;
            case 5:ans.push_back(SA.query());break;
        }
    for (int i=ans.size()-1;i>=0;--i) printf("%d\n",ans[i]);
}
int main(){
    init();
    work();
    return 0;
}

my code

时间: 2024-10-10 19:02:57

tsinsenA1484. two strings(罗干)的相关文章

two strings

A1484. two strings(罗干) 时间限制:1.0s   内存限制:256.0MB [问题描述] 给定两个字符串A和B,有五种操作,操作1为在A串开头添加一个字符,操作2为在A串结尾添加一个字符,操作3为在B串开头添加一个字符,操作4为在B串结尾添加一个字符,操作5为询问当前的B串在当前A串中出现的次数.保证字符均为小写字母,且A.B串初始非空. [输入格式] 第一行第二行分别为初始的A串和B串: 第三行一个整数m,表示操作的次数: 接下来m行,每行表示一个操作,每行第一个数为一个在

【资料】国家集训队论文集(1999~2014)

本文版权归ACShiryu和acvay所有,如转载请注明原作者. 国家集训队1999论文集 1.陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 2.来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 3.齐鑫:<搜索方法中的剪枝优化> 4.邵铮:<数学模型的建立.比较和应用> 5.石润婷:<隐蔽化.多维化.开放化--论当今信息学竞赛中数学建模的灵活性> 6.杨帆:<准确性.全面性.美观性--测试数据设计中的三要素

JavaBean与EJB有何不同uuwc58AA

如果说互联网解决信息不对称,移动互联网解决沟通不及时,那么区块链解决的是信任难建立和价值难共享.比特币3.0时代已经到来,3.0时代意味着"随处可用的区块链".如何实现随处可用?吴萌野老师认为,一是基础链,二是中间件.有关基础链的技术问题和解决方案,吴萌野老师给出的答案是从计算层的改进方向:一是采用更快速的智能合约容器和运行时,并优化共识节点规模.谈到中间件,他希望通过中间件搭建连接互联网云服务和区块链智能合约的中间桥梁,推动区块链应用生态规模化落地. 吴萌野1999年毕业于是清华大学

罗胖又有“惊人之语”:内容收费的窗口期正来到

掌握相关知识的人才能把东西卖得更好;另外,内容直接收费的窗口也即将来临,需要钱买来的内容才最有影响力,靠广告和挣公关费生存下来的自媒体会变少. 钛媒体注:脱口秀主持人.自媒体人代表.说书的人.卖书的人......你很难给罗振宇的身份下一个准确定义.这位“罗辑思维”掌门人一直踩在内容创业的浪尖上,他的多重身份诠释了一种通过内容树立个人品牌,吸引一批粉丝最终得以变现的「网红style」. 所以当罗振宇昨天以卖家身份出现在“2016天猫全球商家大会”时,人们没有太奇怪,而是像听「罗辑思维」那样,怀着好

老罗锤子手机发布会,我感到深深地愧疚

[导语]老罗的锤子手机发布会视频优酷上可以看到,花了两个小时,认真观看了.明显,发布会是成功的,让很多罗粉超出了心理预期,但后期到底卖得如何,还得时间来证明.先别说到底出货量多少,就从此刻往回看,我为老罗的所做所为深深震撼,这个时代不缺乏创新的科技公司,但是缺乏具有灵魂的公司.作为一 名软件开发者,我更感到惭愧,深深地对自己软件的用户愧疚. 一.隔行如隔山,老罗是飞猪 一名英语老师,突然说要去做手机,大家都不看好,雷军都说:"吓我一跳!"网络上更是各种吐槽.讽刺.挖苦,进而有那句&qu

了解更多梭罗与瓦尔登湖

这本经典名著也是被众多名人推荐,一直想看但不能静下来投入进去.当然不同人对书内涵理解会有差异,从刚才的了解它可以被贴以下标签,思考找到自己的生活方式,极简生活只留下必需品,个人生活环境观察记录. <瓦尔登湖>中的梭罗并非隐士,Walden也并不安静,相反,这是一本充满声音,充满趣味的著作. 梭罗并没有住在深山老林里,他亲手搭建的小木屋离Concord市区仅1.6千米.我日常跑步都4千米起,他离市区的距离又怎么可能影响他的社交呢?梭罗表示,我这十几平米的小屋,曾举办过25个人的聚会.其热闹程度可

盘点几种喜好“嘲讽”老罗的人

锤子手机最终扛不住了,近期,锤子科技官方公布声明称,自10月30日上午10点起,对锤子Smartisan T1的售价进行调整,将以1980元(3G版16GB内存)的起步价格在天猫官方旗舰店现货发售.此前,锤子T1手机的3个版本号价格分别为:3G版16G,3000元:3G版32G,3150元:4G版32G,3500元.而此次下调后,这3个版本号的价格分别为:1980元.2080元.2480元,降幅分别为34%.34%和29%. 对这件事,媒体和业界大多持嘲讽的态度,这从非常多评论的标题你就能够看出

罗将公布手机锤,我感到深深的内疚

[导语]老罗的锤子手机公布会视频优酷上能够看到,花了两个小时,认真观看了. 明显.公布会是成功的,让非常多罗粉超出了心理预期,但后期究竟卖得怎样,还得时间来证明.先别说究竟出货量多少,就从此刻往回看.我为老罗的所做所为深深震撼.这个时代不缺乏创新的科技公司.可是缺乏具有灵魂的公司.作为一 名软件开发人员,我更感到羞愧.深深地对自己软件的用户愧疚. 一.隔行如隔山.老罗是飞猪 一名英语老师.突然说要去做手机.大家都不看好,雷军都说:"吓我一跳!"网络上更是各种吐槽.讽刺.挖苦,进而有那句

管理学定律十:罗森塔尔效应与虚假同感偏差

1.罗森塔尔效应 1.1 来源 由美国著名心理学家罗森塔尔和雅格布森在小学教学上予以验证提出,暗示在本质上,人的情感和观念会不同程度地受到别人下意识的影响.人们会不自觉地接受自己喜欢.钦佩.信任和崇拜的人的影响和暗示. "罗森塔尔效应"产生于美国著名心理学家罗森塔尔的一次有名的实验中:他和助手来到一所小学,声称要进行一个"未来发展趋势测验",并煞有介事地以赞赏的口吻,将一份"最有发展前途者"的名单交给了校长和相关教师,极为认真地说:"这