• HDU 4782 Beautiful Soup (模拟+注意细节)


    思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行。

    说说这题的细节:

    1.tag标签里的内容不要动,原样输出。比如<p aa bb cc>,就这样输出就行,不要删空格。题目中说了you shouldn’t change anything of any tag.

    2.标签之外的文本,文本内的空白符(空格,tab,回车),相邻单词之间用一个空格分隔开。文本与标签相邻的地方,不要有多余的空白符,就是说,文本与标签相邻的地方,除了一个回车以及缩进用的空白符之外,不要有任何空白符。

    3.上一个case的</html>跟下一个case的<html>有可能在同一行,并且第一个<html>之前有可能有空白符

    4.每行结尾不要有多余的空格

    5.不要有空行

    以下给出几组数据,空格用<SPACE>表示,tab键用<TAB>表示:

    Input:

    5
    <TAB><html>                <body>
    <h1>ACM            
    ICPC</h1>        
    <p>Hello<br/>World</p>            
    </body></html>            
    <html>            <body><p><TAB>
    Asia Chengdu Regional        </p><TAB>
            <p class="icpc">        
    ACM-ICPC</p></body></html>
    <html>          <TAB>
    <TAB>
    </html><TAB><html>
    <p>
       <TAB>
           aa bb          cc
    
    dafdadgsdfsa<TAB>
    
    afd
         </p>
       <TAB>   </html><TAB><TAB>
    <html><body aslfja        fdsafs<TAB>fdsafsa  ><bb/></body></html>

    Output

    Case #1:
    <html>
     <body>
      <h1>
       ACM ICPC
      </h1>
      <p>
       Hello
       <br/>
       World
      </p>
     </body>
    </html>
    Case #2:
    <html>
     <body>
      <p>
       Asia Chengdu Regional
      </p>
      <p class="icpc">
       ACM-ICPC
      </p>
     </body>
    </html>
    Case #3:
    <html>
    </html>
    Case #4:
    <html>
     <p>
      aa bb cc dafdadgsdfsa afd
     </p>
    </html>
    Case #5:
    <html>
     <body aslfja        fdsafs    fdsafsa  >
      <bb/>
     </body>
    </html>

    代码 

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    
    #define IN 0
    #define OUT 1
    
    #define START 0
    #define END 1
    
    using namespace std;
    
    const int MAXN = 210000;
    
    char str[MAXN];
    char tmp[MAXN];
    char tag[MAXN];
    
    bool CheckEnd( char *s, int len )
    {
        if ( s[len-6] == '<' && s[len-5] == '/' && s[len-4] == 'h'
          && s[len-3] == 't' && s[len-2] == 'm' && s[len-1] == 'l'
          && s[len] == '>' )
          return true;
        return false;
    }
    
    int chuli( char *s, int len )
    {
        int i = 0, j = 0;
        while ( i < len && (s[i] == ' ' || s[i] == 9 || s[i] == '
    ') ) ++i;
        while ( i < len )
        {
            s[j] = s[i];
            if ( s[i] == '>' )
            {
                ++i;
                while ( s[i] == ' ' || s[i] == 9 || s[i] == '
    ' ) ++i;
            }
            else ++i;
            ++j;
        }
        s[j] = '';
        return j;
    }
    
    int DeleteSpace( char *s, int len )
    {
        int i = 0, j = 0;
        while ( i < len )
        {
            if ( s[i] == '<' )
            {
                if ( j - 1 >= 0 && ( s[j - 1] == ' ' || s[j - 1] == 9 ) ) s[j - 1] = s[i++];
                while ( i < len && s[i] != '>' )
                {
                    s[j++] = s[i++];
                }
                s[j++] = s[i++];
            }
            else if ( s[i] == ' ' || s[i] == 9 )
            {
                s[j++] = ' ';
                while ( i < len && ( s[i] == ' ' || s[i] == 9 ) ) ++i;
            }
            else s[j++] = s[i++];
        }
        s[j] = '';
        return j;
    }
    
    void solved( char* s, int len )
    {
        //puts(s);
        int top = 0;
        int i = 0;
        while ( i < len )
        {
            if ( s[i] == '<' )
            {
                int j = 0;
                while ( s[i] != '>' )
                {
                    tag[j++] = s[i++];
                }
                tag[j++] = s[i++];
                tag[j] = '';
    
                if ( tag[1] == '/' )
                {
                    --top;
                    for ( int k = 0; k < top; ++k )
                        putchar(' ');
                }
                else
                {
                    for ( int k = 0; k < top; ++k )
                        putchar(' ');
                    ++top;
                }
                if ( tag[j-2] == '/' ) --top;
                puts(tag);
            }
            else
            {
                for ( int k = 0; k < top; ++k ) putchar(' ');
                while ( i < len && s[i] != '<' )
                {
                    putchar(s[i]);
                    ++i;
                }
                puts("");
            }
        }
        return;
    }
    
    int main()
    {
        int T, cas = 0;
        //freopen( "in.txt", "r", stdin );
        //freopen( "s.txt", "w", stdout );
        scanf( "%d", &T );
        printf( "Case #%d:
    ", ++cas );
        int len = 0;
        while ( gets(tmp) != NULL )
        {
            strcpy( &str[len], tmp );
            len += strlen(tmp);
            str[len++] = ' ';
        }
        str[len - 1] = '';
        //puts(str);
    
        int j = 0;
        for ( int i = 0; i < len; )
        {
            tmp[j++] = str[i++];
            if ( j > 6 && CheckEnd( tmp, j - 1 ) )
            {
                tmp[j] = '';
                --T;
                //printf( "T = %d
    ", T );
                solved( tmp, DeleteSpace( tmp, chuli( tmp, j ) ) );
                j = 0;
                if ( T ) printf( "Case #%d:
    ", ++cas );
            }
        }
        return 0;
    }
  • 相关阅读:
    OSGi for C/C++
    Tizen NPPlugin开发
    Trove4j
    [Tizen]某些目录下存放的东西
    OpenMobile's Application Compatibility Layer (ACL)
    params
    页面无法访问
    websevice 服务前台和后台
    SQL 创建存储过程
    UpdatePanel
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3428291.html
Copyright © 2020-2023  润新知