栈模拟,当遇到“(”,栈塞入左右两个人名标号;当遇到“)”,删除栈顶元素作为x,此时的栈顶元素作为y;当遇到“,”,比“)”多一步操作,就是把栈顶元素作为x,逗号右边名字标号作为y,并且把右边标号塞入栈。。。
ps:把那句清空栈的语句注释掉时间更少,hdu 93ms,bupt 71ms,均排到前10!!!orz
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000010
#define FRE freopen("a.txt","r",stdin)
char str[N];
char name[50005][12];
struct node{
int x,y;
}ans[100010];
stack<int> s;
int main(){
int t;
scanf("%d",&t);
getchar();
while(t--){
gets(str);
int i=0,j;
int len=strlen(str);
int n=1,m=0;
int cnt=1;
//while(!s.empty())s.pop();
s.push(1);
while(i<len){
if(str[i]>='a' && str[i]<='z'){
while(str[i]>='a' && str[i]<='z'){
name[n][m++]=str[i];
i++;
}
name[n][m]='\0';
n++;
}
else{m=0;
if(str[i]=='('){
s.push(n);
ans[cnt].x=n-1;
ans[cnt].y=n;
cnt++;
i++;
}
else{
int xx=s.top();
s.pop();
ans[cnt].x=xx;
ans[cnt].y=s.top();
cnt++;
if(str[i]==','){
ans[cnt].x=s.top();
ans[cnt].y=n;
cnt++;
s.push(n);
}
i++;
}
}
}
printf("%d\n",n-1);
for(i=1;i<n;i++)
printf("%s\n",name[i]);
for(i=1;i<cnt;i++)
printf("%d %d\n",ans[i].x,ans[i].y);
puts("");
}
return 0;
}