求HACK
查看原帖
求HACK
91737
rex_qwq楼主2023/10/4 11:21

小一点的

#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,fma,popcnt,tune=native")
using namespace std;
#define int  long long
#define kg putchar(' ')
#define endl puts("")
inline int read(){
	int vis=1,ans=0;
	char x=getchar();
	while(x<'0'||x>'9'){
		if(x=='-')vis=-1;
		x=getchar();
	}
	while(x>='0'&&x<='9'){
		ans=(ans<<1)+(ans<<3)+x-'0';
		x=getchar();
	}
	return vis*ans;
}
inline void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10+'0');
}
string a,b;
int n,m;
const int N=2090;
int dp[N][N];
int fre[N];
int num;
signed main(){
    cin>>a>>b;
    n=a.size(),m=b.size();
    a=" "+a,b=" "+b;
	for(int i=1;i<=n-m+1;i++){
		int vis=1;
		for(int j=1;j<=m;j++){
			if(a[i+j-1]!=b[j]){vis=0;break;}
		}
		if(vis==1)num++,i+=m-1;
	}
    print(num),kg;
    for(int i=1;i<=n;i++){
        int j=i,k=m;
        while(j&&k){
            if(a[j]==b[k])k--;
            if(!k)break;
            j--;
        }
        if(!k)fre[i]=j;
    }
    for(int i=1;i<=n;i++){
        dp[i][0]=dp[i-1][0];
        for(int j=1;j<=n;j++){
            if(i-j<m)continue;
            dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
            if(fre[i]&&j>=(i-fre[i]+1-m)){
                dp[i][j]=max(dp[i][j],dp[fre[i]-1][j-(i-fre[i]+1-m)]+1);
            }
        }
    }
    for(int i=1;i<=n;i++)print(dp[n][i]),kg;
	return 0;
}
2023/10/4 11:21
加载中...