比较简单,求两个字符串的公共后缀的开始字符的地址,如果没有则输出-1。
该题可以采用STL的map来将地址与字符、下一个地址来进行一一对应。
构建两个链表,也可以采用STL中的LIST来进行添加元素。
然后从两个链表的尾部开始遍历,这里可以用反迭代器。如果两个字符不等或者两个结点的地址不等,则推出遍历,输出结果,注意前导0。
AC代码:
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#define inf 10000000
using namespace std;
struct node
{
char t;
int next;
};
struct nod
{
char t;
int pos;
};
map<int,node> m;
int main()
{
int a,b,n;
cin>>a>>b>>n;
for(int i=0;i<n;i++)
{
int c;
node tmp;
scanf("%d %c %d",&c,&tmp.t,&tmp.next);
m.insert(pair<int,node>(c,tmp));
}
if(m.find(a)==m.end()||m.find(b)==m.end())
{
printf("-1");
return 0;
}
else
{
list<nod> l1;
list<nod> l2;
int ff=a;
while(ff!=-1)
{
nod tmp;
tmp.t=m[ff].t;
tmp.pos=ff;
l1.push_back(tmp);
ff=m[ff].next;
}
ff=b;
while(ff!=-1)
{
nod tmp;
tmp.t=m[ff].t;
tmp.pos=ff;
l2.push_back(tmp);
ff=m[ff].next;
}
list<nod>::reverse_iterator r_it1=l1.rbegin();
list<nod>::reverse_iterator r_it2=l2.rbegin();
int ans=-1;
while(r_it1!=l1.rend()&&r_it2!=l2.rend())
{
if((*r_it1).t!=(*r_it2).t||(*r_it1).pos!=(*r_it2).pos)
{
break;
}
else
{
ans=(*r_it1).pos;
r_it1++;
r_it2++;
}
}
if(ans==-1)
{
printf("-1");
}
else
{
printf("%05d",ans);
}
}
}