bzoj3075: [Usaco2013]Necklace

https://blog.csdn.net/dreaming__ldx/article/details/88069272

https://blog.csdn.net/dingduan9147/article/details/101934455

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=10005,M=1005;
char s[N],t[M];
int tmp=0,ans=0,f[2][M],n,m,fail[M];
int main()
{
    scanf("%s%s",s+1,t+1),n=strlen(s+1),m=strlen(t+1);
    for(ri i=1,j=0;i<=m;++i)
	{
        while(j&&t[i+1]!=t[j+1])
		    j=fail[j];
        fail[i+1]=t[i+1]==t[j+1]?++j:0;
    }
    memset(f[tmp],-1,sizeof(f[tmp]));
    f[tmp][0]=0;
    for(ri i=1;i<=n;++i)
	{
        memset(f[tmp^1],-1,sizeof(f[tmp^1]));
        for(ri j=0,k;j<m;++j)if(~f[tmp][j])
		{
            f[tmp^1][j]=max(f[tmp^1][j],f[tmp][j]);
            k=j;
            while(k&&s[i]!=t[k+1])
			     k=fail[k];
            if(s[i]==t[k+1]) 
			     ++k;
            f[tmp^1][k]=max(f[tmp^1][k],f[tmp][j]+1);
        }
        tmp^=1;
    }
    for(ri i=0;i<m;++i)ans=max(ans,f[tmp][i]);
    cout<<n-ans;
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/cutemush/p/12616560.html