Eliminate Witches!

复制代码
/*
sample input
3
walpurgis(charlotte(patricia,gertrud),elly,gisela)
wuzetian
nanoha(fate(hayate))
*/
/*
DFS
把树的字符串
1
a(b(c,d),e,f)
进行深度优先搜索
当前房间编号i
遇到'('则i-》i+1
遇到','则i-》pre_i   pre_i-》i+1
遇到')'则i-》pre_i   如果pre_i!=1 pre_i-》pre_i' pre_i'-》pre_i+1
 */
#include <stdio.h>
#include <string.h>

int T;//T<=20
char str[1000002];//Madoka's log <=1000000chars
char Witches[50001][11];//at most 50000 rooms
int sum_witches,str_i,str_len,name_i,cur_i;//当前结点编号
int pre_i[50001];//父结点编号
int pass[100002][2];//路线
int pass_i;
int main()
{
    char ch;
    int t,i;
    scanf("%d",&T);
    while (T--)
    {
        memset(pass,0,sizeof(pass));    
        pass_i=0;
        memset(Witches,0,sizeof(Witches));
        sum_witches=1;
        name_i=0;
        memset(pre_i,0,sizeof(pre_i));
        cur_i=1;
        pre_i[cur_i]=-1;
        memset(str,0,sizeof(str));        
        str_i=0;
        scanf("%s",str);
        str_len=strlen(str);        
        while (str_i<str_len)
        {
            ch=str[str_i++];
            switch(ch)
            {
            case '(':
                sum_witches++;
                name_i=0;
                pre_i[sum_witches]=cur_i;
                pass[pass_i][0]=cur_i;
                pass[pass_i][1]=sum_witches;
                pass_i++;
                cur_i=sum_witches;
                break;
            case ',':
                t = pre_i[cur_i];
                pass[pass_i][0]=cur_i;
                pass[pass_i][1]=t;
                pass_i++;
                cur_i=t;
                sum_witches++;
                name_i=0;
                pre_i[sum_witches]=cur_i;
                pass[pass_i][0]=cur_i;
                pass[pass_i][1]=sum_witches;
                pass_i++;
                cur_i=sum_witches;
                break;
            case ')':
                t=pre_i[cur_i];
                pass[pass_i][0]=cur_i;
                pass[pass_i][1]=t;
                pass_i++;
                cur_i=t;
                break;
            default:
                    Witches[sum_witches][name_i++]=ch;
                    if(str[str_i]>'z' || str[str_i]<'a')
                        Witches[sum_witches][name_i]='\0';
                break;
            }
        }
        printf("%d\n",sum_witches);
        for (i=1;i<sum_witches+1;i++)    printf("%s\n",Witches[i]);
        for (i=0;i<pass_i;i++)    printf("%d %d\n",pass[i][0],pass[i][1]);
        printf("\n");
    }
    return 1;
}
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/archive/2012/04/11/2442144.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值