现在的位置: 首页 > 综合 > 正文

poj 1068 模拟题

2013年01月05日 ⁄ 综合 ⁄ 共 896字 ⁄ 字号 评论关闭

模拟题:

算法

1.由输入的P-sequence构找S

2.根据S求每个右括号的左匹配括号,pipei[right] = left

3.根据W-sequence定义求结果

View Code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <stack>
using namespace std;

int p[10000], N;
char stk[100000];
int pipei[10000];

int pre( )
{
  int x = p[1], id;
  for( int i = 0; i < x; i++)
     stk[i] = '(';
  stk[x] = ')';
  id = x;
  for( int i = 2; i <= N; i++)
  {  
     
     int y = p[i];
     if( y > x )
     {
        for( int j = 0; j < y - x; j++)
           stk[++id] = '(';
        x = y;        
     }
     stk[++id] = ')'; 
       
  }
  return id;  
}

void find(int t)
{
  stack<int>px;
  for( int i = 0; i <= t; i++)
  {
      if( stk[i] == '('  )
      {
         px.push( i );
      }
      else
      {
        int x = px.top();
        pipei[i] = x;      
        px.pop( );    
      }          
  }     
} 


void solve(int t)
{
  int x = 0;
  //找到其匹配括号得ID 
  for( int i = 0; i  <=  t; i++)
  {
     if( stk[i] == ')' )
     {
         int t = pipei[i], num = 0;
         //printf("%d\n", t);
         for( int j = t + 1; j <= i; j++)
         {
            if( stk[j] == ')' )
                num++;
                    
              
         }
         p[x++] = num;    
         
     }       
       
  }      
  printf("%d",p[0]);
  for( int i = 1; i < x; i++)
  {
     printf(" %d",p[i]);     
  }
  puts("");   
}

int main( )
{
  int T;
  scanf("%d",&T);
  while(T--)
  {
    scanf("%d",&N);
    for( int i = 1; i <= N; i++)
      scanf("%d", &p[i]);
    int t = pre( );
    find( t );
    solve( t );        
            
  }    
  return 0;  
}

抱歉!评论已关闭.