bzoj3075 [Usaco2013]Necklace dp+kmp

来源:互联网 发布:武汉java培训 编辑:程序博客网 时间:2024/06/01 18:32

挺好的dp题。
设f[i][j]表示走到a串的第i位,已经匹配了b串的前j位,然后kmp转移就好了。
具体看代码。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define inf 0x7f7f7f7fusing namespace std;const int N=1e5+5;typedef long long ll;int next[N];char a[N],b[N];int n,m,x;int f[3][1005];int main(){    scanf("%s%s",a+1,b+1);    n=strlen(a+1);    m=strlen(b+1);    int j=0;    fo(i,2,m)    {        while(j&&b[i]!=b[j+1])j=next[j];        if (b[i]==b[j+1])j++;        next[i]=j;    }    fo(i,1,m-1)f[0][i]=-1;    fo(i,1,n)    {        //x^=1;        fo(j,0,m-1)f[x^1][j]=-1;        fo(j,0,m-1)if (~f[x][j])        {            f[x^1][j]=max(f[x^1][j],f[x][j]);            int k=j;            while (k&&b[k+1]!=a[i])k=next[k];            if (b[k+1]==a[i]) k++;            f[x^1][k]=max(f[x^1][k],f[x][j]+1);        }        x^=1;    }    int ans=0;    fo(i,0,m-1)ans=max(ans,f[x][i]);    printf("%d\n",n-ans);    return 0;}
原创粉丝点击