#2446. 公式编辑器

公式编辑器

本题没有可用的提交语言。

题目描述

编辑数学公式总是一件烦人的事情,为此HURRICANE小组准备出一个编辑数学公式的软件。除了基本功能外,软件还将实现分式和矩阵输入。按照设想,软件应该是符合人性化设计的,必须最大限度的方便用户输入,尽管代价是软件开发极其复杂。幸好输入的方式和格式都已定好,你只需要编个处理程序就行了,下面是相关的约定和格式:

【格式控制的概念】

<o:p>   </o:p>

元素

元素可以是运算符括号数字字母矩阵分式<o:p></o:p>

数字、字母和括号

数字包括’0’..’9’’.’。字母包括’A’..’Z’’a’..’z’。括号包括。它们都只占一行,该行也是对齐行。<o:p></o:p>

表达式

0个到至多500元素构成的序列。其中矩阵与分式元素总个数最多不超过30个。<o:p></o:p>

编辑框

一个输入表达式的矩形区域。每一个编辑框都包括一个对齐行用作编辑框相互之间的对齐。且我们定义编辑框的宽度为最长一行的字符个数,例如表达式空的时候为0,高度为最高行与最低行之间相差的行数(包括),但最小为1,即使表达式为空。<o:p></o:p>

对齐行

编辑框元素中某一特定行。该行用于框内对齐表达式及框间对齐,对齐时需要使表达式中的元素对齐行位于编辑框的对齐行上。<o:p></o:p>

运算符

’+’’-’’*’’/’四个,为了区分“-”(减号)与分数线,“-”两边分别加上一个空列。<o:p></o:p>

矩阵

一个<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"></v:stroke><v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"></v:f> <v:f eqn="sum @0 1 0"></v:f> <v:f eqn="sum 0 0 @1"></v:f> <v:f eqn="prod @2 1 2"></v:f> <v:f eqn="prod @3 21600 pixelWidth"></v:f> <v:f eqn="prod @3 21600 pixelHeight"></v:f> <v:f eqn="sum @0 0 1"></v:f> <v:f eqn="prod @6 1 2"></v:f> <v:f eqn="prod @7 21600 pixelWidth"></v:f> <v:f eqn="sum @8 21600 0"></v:f> <v:f eqn="prod @7 21600 pixelHeight"></v:f> <v:f eqn="sum @10 21600 0"></v:f> </v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" o:ole="" style="width: 29.25pt; height: 11.25pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.wmz" o:title=""></v:imagedata> </v:shape><v:shape id="_x0000_i1026" type="#_x0000_t75" o:ole="" style="width: 51.75pt; height: 14.25pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.wmz" o:title=""></v:imagedata> </v:shape>,_<v:shape id="_x0000_i1027" type="#_x0000_t75" o:ole="" style="width: 48.75pt; height: 14.25pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.wmz" o:title=""></v:imagedata> </v:shape>)的矩阵包含<v:shape id="_x0000_i1028" type="#_x0000_t75" o:ole="" style="width: 29.25pt; height: 11.25pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.wmz" o:title=""></v:imagedata> </v:shape>编辑框将矩阵分为了m编辑列n编辑行。在矩阵的同一编辑行中,相邻的两个编辑框按编辑框的对齐行对齐,同一编辑列的编辑框按照它们的宽度居中对齐。且必须保证行与行之间至少存在一个空行,列与列之间至少存在一个空列。第一列左边与最后一列右边每行各有一个“[”和“]”,位于各行表达式的对齐行上,如图所示:

<o:p>   </o:p>

图形表示

<v:shape id="_x0000_i1029" type="#_x0000_t75" o:ole="" style="width: 93pt; height: 105.75pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image008.wmz" o:title=""></v:imagedata> </v:shape><o:p></o:p>

文本表示<o:p></o:p>

<o:p>   </o:p>

<v:rect id="_x0000_s1026" style="margin-top: 6.1pt; z-index: 1; left: 0px; margin-left: 40.35pt; width: 7.1pt; position: absolute; height: 124.8pt; text-align: left; mso-position-horizontal-relative: text; mso-position-vertical-relative: text"> <v:stroke dashstyle="dash"></v:stroke> </v:rect>          612

[  456   -----]     -第一编辑行的对齐行

          123

                    -空行、整个矩阵的对齐行

  65535

[-------  234 ]     -第二编辑行的对齐行

<v:shapetype id="_x0000_t48" coordsize="21600,21600" o:spt="48" path="m@0@1l@2@3@4@5nfem,l21600,r,21600l,21600xe" adj="-10080,24300,-3600,4050,-1800,4050"> <v:stroke joinstyle="miter"></v:stroke> <v:formulas> <v:f eqn="val #0"></v:f> <v:f eqn="val #1"></v:f> <v:f eqn="val #2"></v:f> <v:f eqn="val #3"></v:f> <v:f eqn="val #4"></v:f> <v:f eqn="val #5"></v:f> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="custom" arrowok="t" o:connectlocs="@0,@1;10800,0;10800,21600;0,10800;21600,10800"></v:path> <v:handles> <v:h position="#0,#1"></v:h> <v:h position="#2,#3"></v:h> <v:h position="#4,#5"></v:h> </v:handles> <o:callout v:ext="edit" on="t"></o:callout> </v:shapetype><v:shape id="_x0000_s1027" type="#_x0000_t48" adj="-10800,1054,-6349,7902,-1964,7902,-10800,1054" style="margin-top: 13.9pt; z-index: 2; left: 0px; margin-left: 75.6pt; width: 66pt; position: absolute; height: 24.6pt; text-align: left"> <v:textbox style="mso-next-textbox: #_x0000_s1027"> </v:textbox> </v:shape>

间隔1

    1

  -----

   255

若矩阵的编辑行数n为奇数,则矩阵的对齐行为中间那行编辑行中编辑框的对齐行,否则为中间两个编辑行之间的空行;<o:p></o:p>

分式

分式由分子和分母两个编辑框以及它们之间的分数线组成。分式分数线为一条由“-”组成的字符序列,同时它也是分式的对齐行。分式的宽度为两个编辑框宽度的最大值加2,即在左右两边分别加上一个“-”;而高度为两个编辑框的高度加上分数线的高度1。两个编辑框按居中对齐,如图:

 XXXX              XX

------          --------

 XXX            XXXXXX

在居中对齐时,如果不能正好对准,则往左偏半格,如上图左边的分母编辑框。<o:p></o:p>

<o:p>   </o:p>

光标控制】

<o:p>   </o:p>

应该指出,编辑框是可以层层嵌套的,比如一个编辑框内有一个矩阵,矩阵内又有若干个编辑框。我们说该编辑框比矩阵的编辑框高一级,矩阵内的所有编辑框同级,分式的两个编辑框也是同级的。注意:同级只是对一个矩阵或一个分式内的编辑框而言。

光标可以跳到编辑框的开始和末尾,也可以向四个方向移动,设光标所处的最低一级的编辑框为A

<o:p>   </o:p>

Ø       如果光标跳到编辑框的开始(末尾),则把光标置于A的前端(末端);


<o:p>   </o:p>

Ø       当光标上下移动时

n        如果A()方有与A同级的编辑框B,则把光标置于B的前端,

示例

下移一次后

 XXXX|

------

  XX

XXXX

------

  |XX

n        否则对比A高一级的编辑框作同样判断,若A是最高级别的编辑框,则不作任何处理。如图,竖线代表光标:

示例

下移一次后

再下移一次后(不变)

  d

 ---

  |c

-----

  a

 ---

  b

  d

 ---

  c

-----

<v:line id="_x0000_s1028" from="4.5pt,3.75pt" to="4.5pt,42.75pt" style="z-index: 3; left: 0px; position: absolute; text-align: left"></v:line>  a

 ---

  b

  d

 ---

  c

-----

<v:line id="_x0000_s1029" from="4.35pt,6.1pt" to="4.35pt,45.1pt" style="z-index: 4; left: 0px; position: absolute; text-align: left"></v:line>  a

 ---

  b

<o:p>   </o:p>

Ø       当光标左(右)移动时

n        若光标位于A的前端(末端)

u      如果左()边没有同级的编辑框,则光标将返回到更高一级的编辑框(若无则不作处理),置于矩阵或分式的左()边;

u      如果左(

输入格式

每行有一个代表事件的字符串,直到文件结束。我们约定矩阵的规模不超过<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> 10*10<v:stroke joinstyle="miter"></v:stroke><v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"></v:f> <v:f eqn="sum @0 1 0"></v:f> <v:f eqn="sum 0 0 @1"></v:f> <v:f eqn="prod @2 1 2"></v:f> <v:f eqn="prod @3 21600 pixelWidth"></v:f> <v:f eqn="prod @3 21600 pixelHeight"></v:f> <v:f eqn="sum @0 0 1"></v:f> <v:f eqn="prod @6 1 2"></v:f> <v:f eqn="prod @7 21600 pixelWidth"></v:f> <v:f eqn="sum @8 21600 0"></v:f> <v:f eqn="prod @7 21600 pixelHeight"></v:f> <v:f eqn="sum @10 21600 0"></v:f> </v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock> </v:shapetype>,总的元素个数不超过10,000

输出格式

按规定的格式输出编辑框的结果,空白的地方用空格补上,每行行末不能有多余空格。最后一行行末保留一个回车。

输入样例

输出样例