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
输出的结果大家根据题意可以推断出来