字符串游戏

来源:互联网 发布:有趣的淘宝收货人名字 编辑:程序博客网 时间:2024/05/17 07:52

题目大意

这里写图片描述

题解

瞎猜想和画图得到一个不好说的结论。
用诡异的单调栈做。

#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;const int maxn=1000000+10;char a[maxn],b[maxn],sta[maxn];int dl[maxn*3][2];int i,j,k,l,t,n,m,tot,head,tail,ans,mi,cnt,num;bool czy;int main(){    freopen("game.in","r",stdin);freopen("game.out","w",stdout);    scanf("%d",&n);    scanf("%s",a+1);    scanf("%s",b+1);    fo(i,1,n+1)        if (i>n||a[i]!=b[i]) break;    if (i>n){        printf("0\n");        return 0;    }    czy=1;    mi=n+1;    i=n;k=n+1;    head=n+1;tail=n;    while (i){        j=i;        while (j>1&&b[j-1]==b[i]) j--;        k=min(k,j);        while (k&&a[k]!=b[i]) k--;        if (!k){            czy=0;            break;        }        while (head<=tail){            if (dl[tail][0]-num>i) tail--;            else break;        }        cnt++;        num++;        head--;        dl[head][0]=k+num;        dl[head][1]=1-cnt;        ans=max(ans,dl[tail][1]+cnt);        i=j-1;    }    if (!czy) printf("-1\n");    else printf("%d\n",ans);}
原创粉丝点击