分数 25
全屏浏览题目
切换布局
作者 CHEN, Yue
单位 浙江大学
To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, loading
and being
are stored as showed in Figure 1.
Figure 1
You are supposed to find the starting position of the common suffix (e.g. the position of i
in Figure 1).
Input Specification:
Each input file contains one test case. For each case, the first line contains two addresses of nodes and a positive N (≤105), where the two addresses are the addresses of the first nodes of the two words, and N is the total number of nodes. The address of a node is a 5-digit positive integer, and NULL is represented by −1.
Then N lines follow, each describes a node in the format:
Address Data Next
whereAddress
is the position of the node, Data
is the letter contained by this node which is an English letter chosen from { a-z, A-Z }, and Next
is the position of the next node.
Output Specification:
For each case, simply output the 5-digit starting position of the common suffix. If the two words have no common suffix, output -1
instead.
Sample Input 1:
11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
Sample Output 1:
67890
Sample Input 2:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
Sample Output 2:
-1
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
测试点4是当地址1和2相同的时候
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int main(){
int data[N],next[N],li[N],li2[N];//data记录数据,next记录下一个地址,li记录第一个单词的各节点地址,li2是第二个
int add1,add2,n;
cin>>add1>>add2>>n;
if(add1==add2){//完全相同时则输出起始地址即可(测试点4)
printf("%05d\n",add1);
return 0;
}
for(int i=0;i<n;i++){//输入
int add,ne;
char k;
cin>>add>>k>>ne;
data[add]=k;
next[add]=ne;
}
int cur=0,cur2=0;
while(add1!=-1){//将第一个单词的所有结点放入li
li[cur++]=add1;
add1=next[add1];
}
while(add2!=-1){//将第二个单词的所有结点放入li2
li2[cur2++]=add2;
add2=next[add2];
}
reverse(li,li+cur);//反转li
reverse(li2,li2+cur2);//反转li2
int cnt=0;
while(li[cnt]==li2[cnt])cnt++;//找到第一个不同的地址
if(cnt!=0)printf("%05d\n",li[cnt-1]);//输出不同地址的前一个地址即为所求地址
else cout<<-1<<endl;//若第一个地址就不同则返回-1
return 0;
}