【HDOJ6342】Expression in Memories(模拟)
题意:
给定一个由0123456789+* ?组成的表达式,其中?可以被改为任意其它字符,问修改问号后是否有方案使得表达式合法
len<=5e2,sumlen<=1e5
思路:
1 #include <stdio.h> 2 #include <math.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 #include <ctype.h> 9 #include <limits.h> 10 #include <set> 11 #include <map> 12 #include <vector> 13 #include <stack> 14 #include <queue> 15 #include <list> 16 #define left (now<<1) 17 #define right ((now<<1)+1) 18 #define mid ((l+r)>>1) 19 #define fst first 20 #define snd second 21 using namespace std; 22 typedef long long lint; 23 24 const int MAXN = 5e2 + 10; 25 26 char str[MAXN]; 27 int n; 28 bool ok[MAXN]; 29 30 void init(){ 31 for(int i = 0; i < MAXN; ++i){ 32 str[i] = '\0'; 33 } 34 } 35 36 int main(){ 37 int t; scanf("%d",&t); 38 while(t--){ 39 init(); scanf("%s",str); int len = strlen(str); bool zero = false; 40 memset(ok,false,sizeof(ok)); 41 for(int i = 0; i < len; ++i){ 42 if(str[i] == '?'){ 43 str[i] = '1'; ok[i] = true; 44 } 45 } 46 47 bool can = true; zero = false; 48 if(str[0] == '+' || str[0] == '*' || str[len - 1] == '+' ||str[len - 1] == '*'){ 49 can = false; 50 } 51 for(int i = 0; i < len - 1; ++i){ 52 if((str[i] == '+' || str[i] == '*') && (str[i + 1] == '*' || str[i + 1] == '+')){ 53 can = false; break; 54 } 55 } 56 for(int i = 0; i < len; ++i){ 57 if(isdigit(str[i]) && zero){ 58 if(ok[i] == false){ 59 can = false; break; 60 }else{ 61 str[i] = '+'; 62 } 63 } 64 if(str[i] == '0' && (i == 0 || !isdigit(str[i - 1]))){ 65 zero = true; 66 }else{ 67 zero = false; 68 } 69 } 70 if(str[0] == '+' || str[0] == '*' || str[len - 1] == '+' ||str[len - 1] == '*'){ 71 can = false; 72 } 73 for(int i = 0; i < len - 1; ++i){ 74 if((str[i] == '+' || str[i] == '*') && (str[i + 1] == '*' || str[i + 1] == '+')){ 75 can = false; break; 76 } 77 } 78 if(can){ 79 printf("%s\n",str); 80 }else{ 81 printf("IMPOSSIBLE\n"); 82 } 83 } 84 return 0; 85 }
null