关闭

【JZOJ 3427】归途与征程

标签: kmp字符串
629人阅读 评论(0) 收藏 举报
分类:

Description

这里写图片描述

Solution

题意简化以后就是:在b串的同构中,有多少个可以按顺序匹配多个串。
我们可以先把a串拆开,每个做一遍KMP的预处理,
倍长b串,枚举b串的开头,依次匹配过去,
每次匹配的时候,记录一下上一次匹配失败的位置,直接从上次匹配失败的地方开始匹配;成功是也记录一下,判断一下当前可不可以用那个匹配成功的去匹配当前的位置。
复杂的:O(nm);

Code

#include<cstdio>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=100500;
int m,n,ans;
char b[N*2],a[N];
int nx[N],A[N][2],A0;
int B[N],L[N];
int max(int a,int b){return a<b?b:a;}
bool ss(int q,int l,int r)
{
    l=max(l,L[q]);
    if(A0==1&&l!=r+1)return 0;
    if(q>A0 && l<=r+1)return 1;
    if(r-l<A[q][1]-A[q][0])return 0;
    if(q==A0 && a[n]!='*')
    {
        int w=r-(A[q][1]-A[q][0])-A[q][0];
        fo(i,A[q][0],A[q][1])if(a[i]!=b[w+i])return 0;
        return 1;
    }
    int j=A[q][0]-1;
    if(B[q]>=l)return ss(q+1,B[q]+A[q][1]-A[q][0],r);
    fo(i,l,r)
    {
        while(j>=A[q][0]&&a[j+1]!=b[i])j=nx[j];
        if(a[j+1]==b[i])j++;
        if(j>=A[q][1])
        {
            bool z=ss(q+1,i+1,r);
            B[q]=z*(i-j+2);
            return z;
        }
    }
    L[q]=max(L[q],r-j);
    return 0;
}
int main()
{
    int q,w;char ch;
    for(ch=getchar();ch<='z'&&ch>='a'||ch=='*';ch=getchar())a[++n]=ch;
    a[n+1]=a[0]='*';
    for(;!(ch<='z'&&ch>='a');ch=getchar());
    for(;ch<='z'&&ch>='a';ch=getchar())b[++m]=ch;
    fo(i,1,m)b[m+i]=b[i];
    fo(i,1,n)if(a[i]!='*')
    {
        if(a[i-1]=='*')A[++A0][0]=i;
        A[A0][1]=i;
    }
    fo(I,1,A0)
    {
        int j=A[I][0]-1;
        nx[A[I][0]]=j;
        fo(i,A[I][0]+1,A[I][1])
        {
            while(j>=A[I][0]&&a[j+1]!=a[i])j=nx[j];
            if(a[j+1]==a[i])j++;
            nx[i]=j;
        }
    }
    ans=0;
    if(!A0)ans=m;else
    for(int i=1,j=0;i-j<=m;i++)
    if(a[1]=='*')ans+=ss(1,i,i+m-1);else
    {
        while(j>=A[1][0]&&a[j+1]!=b[i])j=nx[j];
        if(a[j+1]==b[i])j++;
        if(j>=A[1][1])
        {
            ans+=ss(2,i+1,i-j+m);
            j=nx[j];
        }
    }
    printf("%d\n",ans);
    return 0;
}
1
0
查看评论

jzoj 3427 归途与征程

jzoj 3427
  • ssl_lyy
  • ssl_lyy
  • 2017-08-18 21:56
  • 116

[JZOJ 3427] 归途与征程

Description 对于100%的测试点,1<=N<=100,1<=M<=100000。Analysis我们可以把A串视为一些串中间隔着一些星号。 显然,A串头尾都没有星号是有星号的特殊情况。因为无星号可以跳过头尾的串变成头尾都是星号。 下图,上者A,下者B。 ...
  • lyd_7_29
  • lyd_7_29
  • 2016-06-01 12:41
  • 369

归途与征程

题目描述简单的思路把B串倍长,那么新的串任意一个长度为M的子串都是B的循环同构串。 按照*号把A串分成了若干段,然后每一段都与B串做一次KMP匹配。 具体的,设一个bz[i,j]表示B串第i个位置为开头是否能与第j段匹配。 那么统计答案就是枚举循环同构串的头部,不断往后跑。 当然,如果A串的...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2016-05-28 14:57
  • 335

归途与征程 Journey

题目描述:“感谢你们来访 Nescafe 之塔,封印的能量会在两天之内完全被贮存在神杯之中,你们也该回去了。” “不过圣主,我们还有一个问题。难道……Nescafe 就这样被封印成一座神杯,保存在塔中了吗?” “也许吧。谁知道呢?或许来年的秋天会有有识之士来开启它呢……” “有识之士?他是谁?...
  • zhangche0526
  • zhangche0526
  • 2017-02-07 19:56
  • 173

【NOIP2013模拟】归途与征程

Description给出两个字符串,A和B,|A|=n,|B|=m,并且A中有许多*——通配符。这个东西可以匹配任意的字符串,包括空串。现在问你,B的循环同构的字符串中,有多少个可以和A匹配? n<=100,m<=10^5Solution什么东东? 还以为是扩k呢。。。 实际上只...
  • alan_cty
  • alan_cty
  • 2016-05-30 19:46
  • 764

[jzoj]3427. 【NOIP2013模拟】归途与征程(字符串DP+贪心)

Problem给定一个A串,一个B串,A串的’* ‘可以匹配B串的任意多个字符,若除’*’以外所有字符一一对应,则称A,B匹配,求在B串所有的循环串中有多少个与A匹配.Data constraint对于30%的数据,M<=20;对于80%的测试点,M<=200;对于100%的测试点,1&...
  • Algor_pro_king_John
  • Algor_pro_king_John
  • 2017-08-18 21:35
  • 167

【NOIP2013模拟】归途与征程 题解+代码

DescriptionInput第一行为字符串A。 第二行为字符串B。Output输出在B的所有循环同构串中,有多少个能够与A匹配。Sample Input输入1: aaaa aaaa 输入2: a*a aaaaaa 输入3: * a*b*c * abacabadabacabaSa...
  • u011056504
  • u011056504
  • 2016-06-01 19:18
  • 327

[JZOJ3427]【NOIP2013模拟】归途与征程

DescriptionSolution注意,这里的匹配是全部都要匹配,不能落下一点。Code
  • hzj1054689699
  • hzj1054689699
  • 2016-06-01 12:47
  • 226

bzoj3059 归途与征程(字符串,优化dp)

各种奇怪的优化,然后各种恶心的细节,然后直接的暴力。
  • Icefox_zhx
  • Icefox_zhx
  • 2018-01-13 21:37
  • 67

最熟悉的路,莫过于归途

2016年春运已经拉开帷幕。俗话说,有钱没钱,回家过年。春运是史上最大规模人类迁徙,再美的风景,也比不过那段回家的路。也许艰难困苦,也许落寞孤独,可无论走得多远、身在何处,到了这个时候,心心念念的,便只有踏上回家的路。   回家的路 数一数一生多少个寒暑 数一数起起落落的旅途 多...
  • shenggulu
  • shenggulu
  • 2016-02-04 13:59
  • 113
    个人资料
    • 访问:122908次
    • 积分:4599
    • 等级:
    • 排名:第7683名
    • 原创:340篇
    • 转载:2篇
    • 译文:0篇
    • 评论:44条
    博客公告
    JZ 403-Server


    博主的智商比较低,人比较蠢,因此神犇们如发现任何的错误欢迎拍打喂食吐槽
    --------
    【JZOJ 2700】【GDKOI2012模拟02.01】数字(中国剩余定理)
    群论
    SAM习题
    生成函数
    CF286E Ladies' Shop
    3169. 【GDOI2013模拟4】生产汽车
    5502. 【清华冬令营模拟】Travel
    【WC2016模拟】Picture
    【NOI2016模拟3.1】hypocritical
    5525. 【清华冬令营2018模拟】Atom
    -------------有空写博客

    https://agc013.contest.atcoder.jp/tasks/agc013_d
    https://agc011.contest.atcoder.jp/tasks/agc011_f
    https://agc010.contest.atcoder.jp/tasks/agc010_d
    https://agc009.contest.atcoder.jp/tasks/agc009_e
    https://arc080.contest.atcoder.jp/tasks/arc080_d

    ----上边的暂时还不会QwQ
    https://arc075.contest.atcoder.jp/tasks/arc075_d
    https://arc077.contest.atcoder.jp/tasks/arc077_d
    博主状态

    Too Weak,
    so
    Fighting!!!

    链接
    最新评论