poj_1068_Parencodings_問題解決レポート
1412 ワード
テーマの出典
タイトル:
文字列Sには2つの符号化方式がある.
1.P-sequence:右括弧に遭遇した場合、現在左のすべての左括弧を記録する
2.W-sequence:右かっこに遭遇した場合、現在の右かっこに一致する左かっこ内の右かっこの数を記録し、自分を含む
解法かいほう:シミュレーション
構想:最も簡単で直接的な方法を用いて、まずP-sequence符号化を原始文字列Sに変換し、更に原始文字列SからW-sequence符号化に変換する
この問題の解法は後で最適化する必要がある.
コード:
タイトル:
文字列Sには2つの符号化方式がある.
1.P-sequence:右括弧に遭遇した場合、現在左のすべての左括弧を記録する
2.W-sequence:右かっこに遭遇した場合、現在の右かっこに一致する左かっこ内の右かっこの数を記録し、自分を含む
解法かいほう:シミュレーション
構想:最も簡単で直接的な方法を用いて、まずP-sequence符号化を原始文字列Sに変換し、更に原始文字列SからW-sequence符号化に変換する
この問題の解法は後で最適化する必要がある.
コード:
/*
360K 0MS
*/
#include <stdio.h>
#include <string.h>
int p[20];
char S[100];
void build(int *p, int n); // P
void getw_sequence(); // W
int main()
{
int i;
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &p[i]);
build(p, n);
getw_sequence();
}
return 0;
}
void build(int *p, int n)
{
memset(S, '\0', sizeof(w));
memset(S, '(', p[0]);
S[p[0]] = ')';
int i;
int w_index = p[0] + 1;
for (i = 1; i < n; i++)
{
memset(&S[w_index], '(', p[i] - p[i-1]);
w_index += p[i] - p[i-1];
S[w_index++] = ')';
}
}
void getw_sequence()
{
int i = 0;
int n = 1;
int k, num = 1; //num W
while (S[i] != '\0')
{
if (S[i] == ')')
{
num = 1, n = 1; // , num n 1
k = i, k--;
while (n != 0)
{
if (S[k] == ')')
n++, num++;
if (S[k] == '(')
n--;
k--;
}
printf("%d ", num);
}
i++;
}
printf("
");
}