70,023
社区成员




题目:
Description
括号序列是由左括号“(”和右括号“)”组成的非空序列。对于一个括号序列很容易判定其合法性。比如“()”、“(())()”、“(()())”、“(()(()))”、“()()()”都是合法的,而“)”、“(”、“(()”、“(()))(”都是非法的。
给定n个括号序列,两两配对,问最多能组成多少对合法括号序列。(每一个括号序列只能在一对中出现)
Input
第一行输入整数 表示有 n个括号序列。
接下来 n行,每行输入一个只由“(”和”)“构成的字符串Si 。(字符串长度满足1<|Si|<1e5)
Output
输出一个整数,表示最大的合法括号序列对数。Example
测试用例 1 以文本方式显示 (copy)
- 7↵
- )())↵
- )↵
- ((↵
- ((↵
- (↵
- )↵
- )↵
以文本方式显示 (copy)
- 2↵
测试用例 2 以文本方式显示 (copy)
- 2↵
- (())↵
- ()↵
以文本方式显示 (copy)
- 1↵
本人代码:#include <string.h> #include <stdio.h> #include <stdlib.h> typedef long long int lli; typedef struct Str{ char arr[200000]; lli left; lli right; struct Str *next; }str; //基本思路:使用链表储存字符串,链表为空时往里插结点,否则就用新的信息与链表内各节点比较 //先判断左右括号合起来是否相等(不等则肯定不成立) //然后将两个字符串拼接(有两个顺序都要考虑)存左括号,遇到右括号弹出; lli getl(char a[]){ lli result=0; for(int i=0;i<strlen(a);i++){ if(a[i]=='('){ result++; } } return result; } lli getr(char a[]){ lli result=0; for(int i=0;i<strlen(a);i++){ if(a[i]==')'){ result++; } } return result; } void reset(str *head,str *p){//重置尾结点 p=head; while(p->next!=NULL){ p=p->next; } } void getout(str *head,str *p){//脱开某个结点 str *q=head; while(q->next!=p){ q=q->next; }//停在q->next=p这,即q为p前一节点 q->next=p->next; free(p); } int main(){ lli result=0; lli n=0; scanf("%lld",&n); getchar();//吃空格 //头指针 str *head=(str*)malloc(sizeof(str)); head->next=NULL; str *tail=head;//尾结点 //读入后续结点 for(lli i=1;i<=n;i++){ //前置处理 str *curr=(str*)malloc(sizeof(str)); gets(curr->arr); curr->left=getl(curr->arr); curr->right=getr(curr->arr); //对于可能为第一个结点而言 if(tail==head){//如果尾结点为头结点 head->next=curr; curr->next=NULL; tail=tail->next;//尾结点指向curr } else{ str *place=head->next;//走链表的指针 int pp=0;//匹配状态 while(place!=NULL){//脱出条件:走完全链表 if(place->left+curr->left!=place->right+curr->right){//括号数量不匹配 place=place->next; } else{//括号匹配 char *cfront=strcat(curr->arr,place->arr); lli lbox=0; int status=1; for(lli i=0;i<strlen(cfront);i++){ if(cfront[i]=='('){ lbox++; } else if(cfront[i]==')'){ if(lbox>0){ lbox--; } else{ status=0; break; } } } if(status&&lbox==0){//匹配成功 result++; pp=1; getout(head,place);//断开place结点 free(curr); reset(head,tail);//重置tail结点至尾结点 break; } char *cback=strcat(place->arr,curr->arr); lbox=0; status=1; for(lli i=0;i<strlen(cback);i++){ if(cback[i]=='('){ lbox++; } else if(cback[i]==')'){ if(lbox>0){ lbox--; } else{ status=0; break; } } } if(status&&lbox==0){//匹配成功 result++; pp=1; getout(head,place);//断开place结点 free(curr); reset(head,tail);//重置tail结点至尾结点 break; } else{ place=place->next; } } } if(pp==0){//走完,没有匹配的,加到链表尾端 tail->next=curr; curr->next=NULL; tail=tail->next; } } } printf("%lld\n",result); }
出现了以下的结果:
实在是不知道问题出在哪里了,请社区的各位大佬救救孩子吧……