听灌多(求调)
  • 板块灌水区
  • 楼主yueluoxingchen
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/24 13:36
  • 上次更新2024/7/24 14:50:47
查看原帖
听灌多(求调)
554576
yueluoxingchen楼主2024/7/24 13:36

P2602 [ZJOI2010] 数字计数

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<stack>
#include<queue>
#define debug() cout<<"qwq"<<endl
#define int long long
using namespace std;

const int N=1500;
string a,b;
int ansa[N],ansb[N];
int pre_a[N],g[N][N];
int dp[N][N];

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

inline void write(int x)
{
	if (!x)
	{
		putchar('0');
		return;
	}
	int len = 0, k1 = x, c[40];
	if (k1 < 0) k1 = -k1, putchar('-');
	while (k1) c[len ++ ] = k1 % 10 ^ 48, k1 /= 10;
	while (len -- ) putchar(c[len]);
}

void solve(string x,int *ans)
{
	memset(g,0,sizeof(g));
	memset(pre_a,0,sizeof(pre_a));
	memset(dp,0,sizeof(dp));
	memset(ans,0,sizeof(ans));
	int cnt=0;
	int yx[N];
	for(int i=0;i<x.length();i++)
	{
		int y=x[i];
		cnt++;
		pre_a[cnt]=pre_a[cnt-1]*10+y;
		yx[cnt]=y;
		//cout<<y<<endl;
		for(int i=0;i<=9;i++)
		{
			if(i==y) g[cnt][i]=g[cnt-1][i]+1;
			else g[cnt][i]=g[cnt-1][i];
		}
		x/=10;
		//cout<<x<<endl;
	}
	for(int i=1;i<=cnt;i--)
	{
	    for(int j=0;j<=9;j++)	
		{
			dp[i][j]=dp[i-1][j]*10 + (pre_a[i-1]-1) + (yx[i]*g[i-1][j]) + (yx[i]>0 ? 1:0) +(j!=0? 1:0); 
		}
	}
	for(int i=0;i<=9;i++)
	{
		for(int j=1;j<=cnt;j++)
		{
			ans[i]=max(ans[i],dp[j][i]);
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		ans[yx[i]]++;
	}
}

signed main()
{
	a=read();
	b=read();
	solve(a-1,ansa);
	solve(b,ansb);
	for(int i=0;i<=9;i++)
	{
		//cout<<ansb[i]<<" "<<ansa[i]<<endl;
		write(ansb[i]-ansa[i]);
		cout<<" ";
	}
	return 0;
}

rt

2024/7/24 13:36
加载中...