比较恶心的一道题…
就是一道大搜索题
假如不允许我们加逗号的话这道题很好做。
那我们就可以搜索逗号的位置转化为上述问题
实际上很多不合法情况会被排除掉所以枚举的复杂度远远不到
250
2
50
但是我们不能搜完再判每个逗号之间个数是否合法
我们得边搜边判,否则会T
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
char s[60];
char c[60];
char ans[60];
int len;
bool flag;
int read()
{
int sum = 0;char c = getchar();bool flag = true;
while( c < '0' || c > '9' ) {if(c == '-') flag = false;c = getchar();}
while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();
if(!flag) sum = -sum;
return sum;
}
int last[60];
void check()
{
rep(i,1,len) c[i] = s[i];
//printf("#%s\n",c+1);
file(last);
int last_len = 0;
bool check = false;
int l , r;
int i = 0;
int now,Max = 0;
while(++i <= len)
{
if(c[i] != ',')
{
if(c[i] == '0') return;
now = 0;
for(int j = i;j <= len&&c[j] != ',';i=j,j++,now++);
if(now < Max) return;
Max = now;
}
}
i = 0;
while(++i <= len)
{
check = false;
if(c[i] != ',')
{
l = i;
for(int j = i;j <= len&&c[j] != ',';r=j,j++)
if(c[j] != '?' && (c[j]-'0' != last[j-i+1])) check = true;
//if(qq) printf("#%d %d\n",l,r);
if(r - l + 1 > last_len)
{
if(c[l] == '?') c[l] = '1';
last[1] = c[l] - 48;
rep(k,l+1,r)
{
if(s[k] == '?') c[k] = '0';
last[k-l+1] = c[k] - '0';
}
last_len = r-l+1;
rep(x,l,r) c[x] = last[x-l+1] + '0';
}
else
if(!check)
{
int j = last_len;
while(j >= 1)
{
for(;j >= 1 && s[j+l-1] != '?';j--);
if(last[j] != 9) break;
int tmp = j;
while(last[j] == 9) j--;
rep(x,j,tmp) if(s[x+l-1] != '?') continue;
}
if(j == 0) return;
while(last[j] == 9) j--;
if(last[j+1] == 9 && j != last_len)
{
last[j]++;
for(j++;j<=last_len;++j)
last[j] = 0;
}
else last[j]++;
rep(j,l,r) c[j] = last[j-l+1] + '0';
}
else
{
int j = l;
while(s[j] == '?' || (s[j] != '?' && (s[j]-'0') == last[j-l+1]) )j++;
if( (s[j]-'0' > last[j-l+1]) )
{
last[j-l+1] = s[j]-'0';
rep(x,j+1,r)
if(s[x] != '?') last[x-l+1] = s[x]-'0';
else last[x-l+1] = 0;
rep(x,l,r) c[x] = last[x-l+1] + '0';
}
else
{
while(s[j] != '?' && j >= l)j--;
if(j == l-1) return;
last[j-l+1]++;
rep(x,j+1,r)
if(s[x] != '?') last[x-l+1] = s[x]-'0';
else last[x-l+1] = 0;
rep(x,l,r) c[x] = last[x-l+1] + '0';
}
}
i = r;
}
}
if(!flag)
{
rep(i,1,len) ans[i] = c[i];
flag = true;
return;
}
bool _new = false;
rep(i,1,len)
{
if(c[i] == ans[i]) continue;
if(c[i] != ',' && ans[i] != ',')
{
if(c[i] > ans[i]) break;
else _new = true;
break;
}
else
{
if(c[i] == ',') _new = true;
break;
}
}
if(_new) rep(i,1,len) ans[i] = c[i];
}
void dfs(int dep,int last,int now)
{
if(dep == len+1)
{
if(now != 0 && now < last) return;
check();
return;
}
if(dep == len)
{
dfs(dep+1,last,now+1);
return;
}
if(dep == 1)
{
dfs(dep+1,last,now+1);
return;
}
if(s[dep] != '?' || (s[dep] == '?' && s[dep+1] == ','))
{
if(s[dep] == ',')
{
if(now < last) return;
dfs(dep+1,now,0);
}
else dfs(dep+1,last,now+1);
}
else
{
if(s[dep-1] != ',')
{
if(now >= last)
{
s[dep] = ',';
dfs(dep+1,now,0);
}
s[dep] = '?';
dfs(dep+1,last,now+1);
}
else dfs(dep+1,last,now+1);
}
return;
}
void work()
{
scanf("%s",s+1);
len = strlen(s+1);flag = false;
if(s[1] == ',' || s[len] == ','){printf("impossible\n");return;}
dfs(1,0,0);
if(!flag) printf("impossible");
else rep(i,1,len) printf("%c",ans[i]);
printf("\n");
}
int main()
{
freopen("history.in","r",stdin);
freopen("history.out","w",stdout);
int T = read();
while(T--) work();
return 0;
}