【PAT】1032 Sharing (25分)测试点3,测试点4,测试点5分析

OJ入口:1032

题意:

你以为题意是求共同后缀的首地址值吗?不不不不,我自己觉得这个地方题意有一点问题,其实就是找到两个单词的第一个共同节点。也就是说只在某一段区间两个串的值是相同的,然后后面的值又可能会不同。例如下图:

在这里插入图片描述

测试点3,4在文章最后给出测试数据(自己设计的),大家可以测试自己的代码。

我一开始就是以为求共同后缀的首地址值吗?也就是从后往前遍历找共同后缀的第一个相同的元素的地址。除了最后一个测试点(测试点五)没有通过,其他都通过了(后面给出AC代码),代码如下:

#include<bits/stdc++.h>
using namespace std;
struct Word{
	int address;
	char data;
	int next;
};
Word first_word[100009],second_word[100009],record[100099];
int main(){
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt","r",stdin);//从1.txt读入 
#endif
	int first,second,count,a,c;
	char b;
	int first_num=0,second_num=0;
	int temp=0;
	cin>>first>>second>>count;
	if(first==-1||second==-1){
		printf("-1");return 0;
	}
	for(int i=0;i<count;i++){
		scanf("%d %c %d",&a,&b,&c);
		record[a].data = b;
		record[a].next = c;
	}
	for(int i=first;i!=-1;i = record[i].next){
		first_word[first_num].address = i;
		first_word[first_num++].data = record[i].data;
	}
	for(int i=second;i!=-1;i = record[i].next){
		second_word[second_num].address = i;
		second_word[second_num++].data = record[i].data;
	}
	//开始查找共同后缀的第一个相同元素的地址
	for(int i=first_num-1,j=second_num-1;i>=0&&j>=0;i--,j--){
		if(first_word[i].data==second_word[j].data) 
			temp = first_word[i].address;
		else break;//找到第一个不同元素则退出循环
	}
	if(temp==0) cout<<"-1";
	else printf("%05d",temp);
	return 0;
}

既然从前往后遍历单词,找到第一个相同的单词,那么可以先遍历第一个单词,遍历过的单词打上标记。遍历完后再进行遍历第二个单词,若找到带标记项的字母那么表示这个单词是第一个相同的单词。输出它的地址就好了。
在原代码中稍微修改一下逻辑,结构体加上一个flag后的AC代码:

#include<bits/stdc++.h>
using namespace std;
struct Word{
	bool flag;
	int address;
	char data;
	int next;
};
Word first_word[100009],second_word[100009],record[100099];
int main(){
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt","r",stdin);//从1.txt读入 
#endif
	int first,second,count,a,c;
	char b;
	int first_num=0,second_num=0;
	int temp=0;
	cin>>first>>second>>count;
	if(first==-1||second==-1){
		printf("-1");return 0;
	}
	for(int i=0;i<count;i++){
		scanf("%d %c %d",&a,&b,&c);
		record[a].data = b;
		record[a].next = c;
		record[a].flag = false;
	}
	for(int i=first;i!=-1;i = record[i].next){
		record[i].flag = true;
	}
	for(int i=second;i!=-1;i = record[i].next){
		if(record[i].flag==true){
			temp = i;break;
		}
	}
	if(temp==0) cout<<"-1";
	else printf("%05d",temp);
	return 0;
}

测试点3数据(其中一个单词为空)

11111 11111 1
11111 a -1
-1

测试点4数据(两个单词相同,且格式记得补0)

00011 00011 3
00011 a 12345
12345 b 65432
65432 c -1

输出的结果大家根据题意可以推断出来

各位点个赞点个赞呗

猜你喜欢

转载自blog.csdn.net/qq_39072627/article/details/107008104