记录编号 98095 评测结果 AAAAAAAAAA
题目名称 复原序列 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.734 s
提交时间 2014-04-21 17:52:26 内存使用 15.88 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int SIZEN=20010,SIZESTEP=200;
string A,B;
vector<int> block;
int M;
bool stepf[SIZESTEP][SIZEN]={0};
vector<int> tpable[2];
bool c[SIZESTEP][SIZEN][2]={0};//0储存v-1是否可行,1储存v是否可行
bool visit[SIZESTEP][SIZEN]={0};
bool ansable[SIZEN][2]={0};
//1是+,0是-
vector<int> reach[SIZEN];
bool tpf[2][SIZEN];
int BOT;
bool solution=false;
void getgraph(bool f[SIZEN],int bot,int n){
	memcpy(tpf[0],f,sizeof(tpf[0]));
	tpable[0].clear();
	memset(c,0,sizeof(c));
	for(int i=0;i<B.size();i++) if(f[i]) tpable[0].push_back(i); 
	for(int i=1;i<=n;i++){
		int k=(i&1);
		memset(tpf[k],0,sizeof(tpf[0]));
		tpable[k].clear();
		for(int t=0;t<tpable[k^1].size();t++){
			for(int j=tpable[k^1][t];j<=tpable[k^1][t]+1;j++){
				if(tpf[k][j]) continue;
				if(B[j]=='+'){
					if(A[bot+i]=='+'||A[bot+i]=='?'){
						if(tpf[k^1][j-1]){
							c[i][j][0]=true;
							tpf[k][j]=true;
						}
					}
					else tpf[k][j]=0;
				}
				else if(B[j]=='*'){
					if(A[bot+i]=='-'||A[bot+i]=='?'){
						if(tpf[k^1][j-1]){
							c[i][j][0]=true;
							tpf[k][j]=true;
						}
						if(tpf[k^1][j]){
							c[i][j][1]=true;
							tpf[k][j]=true;
						}
					}
					else tpf[k][j]=0;
				}
				if(tpf[k][j]) tpable[k].push_back(j);
			}
		}
	}
}
void work(void){
	if(!solution){
		printf("No Solution\n");
		return;
	}
	BOT=A.size();
	ansable[A.size()-1][0]=true;
	reach[A.size()-1].push_back(B.size()-1);
	memset(visit,0,sizeof(visit));
	for(int i=A.size()-1;i>0;i--){
		if(i<=BOT){
			BOT=((i-1)/M)*M;
			getgraph(stepf[(i-1)/M],BOT,i-BOT);
			memset(visit,0,sizeof(visit));
		}
		for(int t=0;t<reach[i].size();t++){
			int j=reach[i][t];//第i层,B[j]能到达
			if(visit[i-BOT][j]) continue;
			visit[i-BOT][j]=true;
			for(int r=0;r<=1;r++){
				if(c[i-BOT][j][r]){
					char ch=B[j+(r-1)];
					if(ch=='+') ansable[i-1][1]=true;
					else if(ch=='*') ansable[i-1][0]=true;
					reach[i-1].push_back(j+(r-1));
				}
			}
		}
	}
	for(int i=1;i<A.size()-1;i++){
		if(ansable[i][0]&&ansable[i][1]) printf("?");
		else if(ansable[i][0]) printf("-");
		else if(ansable[i][1]) printf("+");
	}
	printf("\n");
}
void getable(void){
	memset(tpf[0],0,sizeof(tpf[0]));
	tpf[0][0]=true;
	memcpy(stepf[0],tpf[0],sizeof(tpf[0]));
	tpable[0].push_back(0);
	for(int i=1;i<A.size();i++){
		int k=(i&1);
		memset(tpf[k],0,sizeof(tpf[0]));
		tpable[k].clear();
		for(int t=0;t<tpable[k^1].size();t++){
			for(int j=tpable[k^1][t];j<=tpable[k^1][t]+1;j++){
				if(tpf[k][j]) continue;
				if(B[j]=='+'){
					if(A[i]=='+'||A[i]=='?') tpf[k][j]=tpf[k^1][j-1];
					else tpf[k][j]=0;
				}
				else if(B[j]=='*'){
					if(A[i]=='-'||A[i]=='?') tpf[k][j]=(tpf[k^1][j-1]||tpf[k^1][j]);
					else tpf[k][j]=0;
				}
				if(tpf[k][j]) tpable[k].push_back(j);
				if(i==A.size()-1&&j==B.size()-1) solution=tpf[k][j];
			}
		}
		if(i%M==0) memcpy(stepf[i/M],tpf[k],sizeof(tpf[0]));
	}
}
void init(void){
	cin>>A;
	if(M<1) M=1;
	int x;
	while(scanf("%d",&x)!=EOF) block.push_back(x);
	A="-"+A+"-";
	B="*";
	for(int i=0;i<block.size();i++){
		for(int j=0;j<block[i];j++) B+="+";
		B+="*";
	}
	M=sqrt(A.size()+0.0);
}
int main(){
	freopen("recover.in","r",stdin);
	freopen("recover.out","w",stdout);
	init();
	getable();
	work();
	return 0;
}