Eliminate Witches!-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: