1032. Sharing (25)
题意:找到公共后缀起始的地方。用map记录该路径是否被访问过,flag表示是否存在公共后缀。
最后一个例子对时间卡的很紧,用cin 或 t[i].ch 可能就卡在那10ms了。
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=100005;
struct node{
int id,next;
}t[N],tmp;
int cmp(node a,node b){
return a.id<b.id;
}
map<int,int > m;
int main(){
int s1,s2,n;
char ch;
scanf("%d %d %d",&s1,&s2,&n);
for(int i=0;i<n;i++)
scanf("%d %c %d",&t[i].id,&ch,&t[i].next);
sort(t,t+n,cmp);
int next=s1,last=-1,flag=0;//next是物理地址
while(next!=-1){
m[next]++;
tmp.id=next;
int pos=lower_bound(t,(t+n),tmp,cmp)-t;
next=t[pos].next;
}
next=s2;
while(next!=-1){
if(m[next]==0)
flag=0;
else{//公共部分
if(flag==0)//无后缀
last=next,flag=1;
}
tmp.id=next;
int pos=lower_bound(t,(t+n),tmp,cmp)-t;
next=t[pos].next;
}
if(flag==0)
printf("-1\n");
else
printf("%05d\n",last);
return 0;
}