題目描述:

找到word1和word2的公共后綴的起始位置
輸入
第一行 地址一adress1(word1的起始地址),地址二(word2的起始地址),正整數(shù)(節(jié)點總數(shù))。其中節(jié)點的地址是5位正整數(shù),NULL由-1表示。
然后是N行,每行描述一個格式的節(jié)點:
Address Data Next
其中Address是節(jié)點的位置,Data是該節(jié)點包含的字母,它是從{a-z,A-Z}中選擇的英文字母,Next是下一個節(jié)點的位置。
輸出
輸出公共后綴的起始位置。
解題思路
word1和word2的公共后綴的長度相同,所以從word1和word2長度相同的位置開始比較。先獲得word1和word2的長度len1和len2,假設word1較word2長,先找到word1的第len2-len1個節(jié)點,是的word1余下長度與word2相同,然后逐一比較word1和word2的各節(jié)點的下一個地址是否相等,相同即返回。
代碼
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct node {
char val;
int next;
}nodes[100000];
int main() {
int chain1, chain2, n;
int adress, next;
char val;
cin >> chain1 >> chain2 >> n;
for (int i = 0; i < n; i++) {
cin >> adress;
cin >> val;
cin >> next;
nodes[adress].val = val;
nodes[adress].next = next;
}
//int chain1,j
bool flag = true;
int c2=chain2,c1 = chain1;
int len1=1,len2=1;
while(nodes[c2].next != -1){
c2 = nodes[c2].next;
len2++;
}
while(nodes[c1].next != -1){
c1 = nodes[c1].next;
len1++;
}
while(len1>len2){
chain1 = nodes[chain1].next;
len1--;
}
while(len1<len2){
chain2 = nodes[chain2].next;
len2--;
}
while(nodes[chain1].next != -1&&nodes[chain2].next != -1 ){
//cout<<chain1<<","<<chain2<<endl;
if (chain1 == chain2) {
cout.fill('0');
cout.width(5);
cout << chain1 << endl;
flag = false;
break;
}
chain2 = nodes[chain2].next;
chain1 = nodes[chain1].next;
}
if(flag)
cout<<"-1"<<endl;
return 0;
}