题意 : 给你n行字符串,问你有多少种理解方式。有两大类的理解
(1){A|B|C|D|...}代表着理解方式可以是A,可以是B或C或者D。
(2)$blah blah$,在$$这两个符号中间,如果是不连续的空格的那个位置就有2种理解方式,可以理解为没有空格也可以理解为有空格。如果有连续N个空格的位置,那里就有N+1种理解方式。
最后所有的理解方式相乘,数据保证$一定与$匹配,{一定与匹配},不会有任何嵌套,类似{$$}或者{{}}或者${}$这种情况都不会出现,也不会有{$}这种情况,所有的${}这些符号一定有匹配的。
输出多少种理解方式。
思路 : 模拟,但是由于我们在做的时候一直以为数据范围不会超,就一直WA,后来我直接找特殊数据找的恶心,又看了代码觉得没有错,就放弃了,对不起二师兄。。。。。直接贴YN的代码吧,不想写了,恶心
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <math.h> 11 #include <stdlib.h> 12 #define clear(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE)) 13 #define clearall(A, X) memset(A, X, sizeof(A)) 14 #define max( x, y ) ( ((x) > (y)) ? (x) : (y) ) 15 #define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) 16 17 using namespace std; 18 19 int main() 20 { 21 // freopen("data1.txt","r",stdin); 22 int n,temp,cnt; 23 long long ans ; 24 char c,x; 25 while(scanf("%d",&n)!=EOF) 26 { 27 x = getchar(); 28 while(x != ' ') 29 x = getchar() ; 30 bool flat1 = false , flat2 = false , flat = true ; 31 ans = 1 ; 32 temp = 1 ; 33 while(n--) 34 { 35 c = getchar(); 36 while(c != ' ') 37 { 38 if(flat) 39 { 40 if(ans > 100000 || temp > 100000) 41 { 42 ans = 1000000; 43 flat = false; 44 continue; 45 } 46 if(c == '{') 47 { 48 flat1 = true ; 49 cnt = 1 ; 50 } 51 else if(c == '}') 52 { 53 ans *= cnt ; 54 flat1 = false; 55 } 56 else if(flat1 && c == '|') 57 { 58 cnt ++ ; 59 } 60 else if(!flat2 && c == '$') 61 { 62 flat2 = true ; 63 temp = 1 ; 64 cnt = 1 ; 65 } 66 else if(flat2 && c == '$') 67 { 68 temp *= cnt; 69 ans *= temp; 70 flat2 = false; 71 } 72 else if(flat2 && c == ' ') 73 { 74 cnt ++ ; 75 } 76 else if(flat2 && c != ' ') 77 { 78 temp *= cnt ; 79 cnt = 1 ; 80 } 81 } 82 c = getchar(); 83 } 84 } 85 if(ans > 100000) puts("doge"); 86 else printf("%I64d ",ans); 87 } 88 return 0; 89 }