[关闭]
@ysner 2018-08-04T17:31:12.000000Z 字数 2507 阅读 2063

化简

中缀表达式 模拟


题面

给出一个表达式,其中包含有数字、未知数和括号。把它化简成的形式。系数模

解析

显然直接模拟。

对于直接求中缀表达式的值:

如果加上了未知数,就把数字栈变为多项式栈,用结构体储存所有项的系数,模拟一般多项式运算即可。复杂度上限

听起来很简单是吧。然而我调了2h

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. #define re register
  9. #define il inline
  10. #define ll long long
  11. #define max(a,b) ((a)>(b)?(a):(b))
  12. #define min(a,b) ((a)<(b)?(a):(b))
  13. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  14. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  15. using namespace std;
  16. const int mod=10007;
  17. char s[1005],sta[1005];
  18. int len,top,tot,id[1005];
  19. struct dui
  20. {
  21. ll x[1005],mx;
  22. il dui(){memset(x,0,sizeof(x));mx=0;}
  23. }a[1005];
  24. il void check(re ll &x) {while(x<0) x+=mod;if(x>=mod) x%=mod;}
  25. il dui operator *(dui A,dui B)
  26. {
  27. dui C;
  28. fp(i,0,A.mx)
  29. fp(j,0,B.mx)
  30. {
  31. C.x[i+j]+=A.x[i]*B.x[j];
  32. check(C.x[i+j]);
  33. }
  34. C.mx=A.mx+B.mx;while(C.x[C.mx]==0&&C.mx) --C.mx;
  35. return C;
  36. }
  37. il dui operator +(dui A,dui B)
  38. {
  39. dui C;
  40. fp(i,0,max(A.mx,B.mx))
  41. {
  42. C.x[i]=A.x[i]+B.x[i];
  43. check(C.x[i]);
  44. }
  45. C.mx=max(A.mx,B.mx);while(C.x[C.mx]==0&&C.mx) --C.mx;
  46. return C;
  47. }
  48. il dui operator -(dui A,dui B)
  49. {
  50. dui C;
  51. fp(i,0,max(A.mx,B.mx))
  52. {
  53. C.x[i]=A.x[i]-B.x[i];
  54. check(C.x[i]);
  55. }
  56. C.mx=max(A.mx,B.mx);while(C.x[C.mx]==0&&C.mx) --C.mx;
  57. return C;
  58. }
  59. il ll gi()
  60. {
  61. re ll x=0,t=1;
  62. re char ch=getchar();
  63. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  64. if(ch=='-') t=-1,ch=getchar();
  65. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  66. return x*t;
  67. }
  68. il int check(re char x,re char y)
  69. {
  70. if(x=='(') return 1;if(x==')') return 0;
  71. return id[x]>id[y];
  72. }
  73. il void calc(re dui &x,re dui y,re char p)
  74. {
  75. if(p=='+') x=x+y;
  76. if(p=='-') x=x-y;
  77. if(p=='*') x=x*y;
  78. }
  79. int main()
  80. {
  81. freopen("simplify.in","r",stdin);
  82. freopen("simplify.out","w",stdout);
  83. scanf("%s",s+1);len=strlen(s+1);s[++len]='#';
  84. id['+']=id['-']=2;id['*']=3;id['#']=-1;id['?']=-2;sta[0]='?';
  85. fp(i,1,len)
  86. {
  87. if(s[i]>='0'&&s[i]<='9')
  88. {
  89. if(s[i-1]>='0'&&s[i-1]<='9') a[tot].x[0]=a[tot].x[0]*10+s[i]-'0';
  90. else a[++tot].mx=0,memset(a[tot].x,0,sizeof(a[tot].x)),a[tot].x[0]=s[i]-'0';
  91. }
  92. else if(s[i]=='x') memset(a[++tot].x,0,sizeof(a[tot].x)),a[tot].mx=1,a[tot].x[1]=1;
  93. else
  94. {
  95. if(check(s[i],sta[top])) sta[++top]=s[i];
  96. else
  97. {
  98. if(s[i]==')')
  99. {
  100. while(sta[top]!='(') {
  101. calc(a[tot-1],a[tot],sta[top]);--tot;--top;}
  102. --top;
  103. }
  104. else
  105. {
  106. while(!check(s[i],sta[top])) {
  107. calc(a[tot-1],a[tot],sta[top]);--tot;--top;
  108. }
  109. sta[++top]=s[i];
  110. }
  111. }
  112. }
  113. }
  114. printf("%lld\n",a[1].mx);
  115. fp(i,0,a[1].mx) printf("%lld\n",a[1].x[i]%mod);
  116. fclose(stdin);
  117. fclose(stdout);
  118. return 0;
  119. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注