2017.10.25模拟 c journey

http://www.elijahqi.win/archives/1381
自己写的渣渣代码 只有20分 留作纪念吧

#include<cstdio>
#include<cstring>
#define N 110
#define M 110000
#define inf 0x3f3f3f3f
struct node{
    int st,ed;
}data[N];
char b[M<<1],a[N];
int cnt,ans,na,nb,f[M<<1][N];
inline void solve(int now){
    int last=inf;
    int len=data[now].ed-data[now].st+1;
    for (int i=nb*2-len+1;i;--i){
        int st=data[now].st;bool flag=1;
        for (int j=0;j<len;++j)
            if (b[i+j]!=a[st++]){flag=0;break;}
        if (flag) last=i;f[i][now]=last;
    }
}
int main(){
    freopen("journey.in","r",stdin);
    scanf("%s%s",a+1,b+1);
    na=strlen(a+1),nb=strlen(b+1);memset(f,0x3f,sizeof(f));
    for (int i=1;i<=nb;++i) b[i+nb]=b[i];
    for (int i=1,last=1;i<=na;i=last){
        while (a[i]=='*'&&i<=na) ++i;last=i;if (i==na+1) break;
        data[++cnt].st=last;
        while (a[i]!='*'&&i<=na) ++i;last=i;data[cnt].ed=i-1;solve(cnt);
    }
    for (int i=1;i<=nb*2;++i){
        for (int j=1;j<=cnt;++j){
            printf("%d ",f[i][j]);
        }printf("asdfasdf\n");
    }
    for (int i=1;i<=nb;++i){
        int now=1;int ed=i;
        for (int j=1,last=1;j<=na;j=last){
            while(a[j]=='*'&&j<=na) ++j;if (j>na) break;ed=f[ed][now];
            last=data[now++].ed+1;ed+=data[now-1].ed-data[now-1].st+1;
        }
        if (ed-i<=nb) ans++;
    }
    printf("%d",ans);
    //for (int i=1;i<=cnt;++i) printf("%d %d\n",data[i].st,data[i].ed);
    return 0;
}

思路就是暴力模拟 我认为此题至少省选难度吧可能我太弱了 要想的细节实在太多 想不清

#include<cstdio>
#include<cstring>
#define N 110
#define M 110000
#define inf 0x3f3f3f3f
struct node{
    int st,ed;
}data[N];
char b[M<<1],a[N];
int cnt,ans,na,nb,f[M<<1][N];
inline void solve(int now){
    int last=inf;
    int len=data[now].ed-data[now].st+1;
    for (int i=nb*2-len;i>=1;--i){
        int st=data[now].st;bool flag=1;
        for (int j=0;j<len;++j)
            if (b[i+j]!=a[st++]){flag=0;break;}
        if (flag) last=i;f[i][now]=last;
    }
}
inline bool judge(int st){
    int pos=st,ed=st+nb-1;
    if (a[1]!='*') {
        if (f[st][1]!=st) return 0;else pos=st+data[1].ed-data[1].st+1;
    }else pos=f[st][1]+data[1].ed-data[1].st+1;
    if (pos>=inf) return 0;
    for (int i=2;i<cnt;++i){
        pos=f[pos][i]+data[i].ed-data[i].st+1;if (pos-1>ed) return 0;
    }
    if (a[na]!='*'){
        if (f[ed-data[cnt].ed+data[cnt].st][cnt]!=ed-data[cnt].ed+data[cnt].st) return 0;
        if (pos<=ed-data[cnt].ed+data[cnt].st) return 1;return 0;
    }if (f[pos][cnt]+data[cnt].ed-data[cnt].st<=ed) return 1;return 0;
}
int main(){
    //freopen("journey.in","r",stdin);
    scanf("%s%s",a+1,b+1);
    na=strlen(a+1),nb=strlen(b+1);memset(f,0x3f,sizeof(f));
    for (int i=1;i<=nb;++i) b[i+nb]=b[i];
    for (int i=1,last=1;i<=na;i=last){
        while (a[i]=='*'&&i<=na) ++i;last=i;if (i==na+1) break;
        data[++cnt].st=last;
        while (a[i]!='*'&&i<=na) ++i;last=i;data[cnt].ed=i-1;solve(cnt);
    }
    /*for (int i=1;i<=nb*2;++i){
        for (int j=1;j<=cnt;++j){
            printf("%d ",f[i][j]);
        }printf("asdfasdf\n");
    }*/
    for (int i=1;i<=nb;++i) if (judge(i)) ans++;
    printf("%d",ans);
    //for (int i=1;i<=cnt;++i) printf("%d %d\n",data[i].st,data[i].ed);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值