1032. Sharing (25)
2016-07-08 11:59
253 查看
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
where Address 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:
Sample Output 1:
Sample Input 2:
Sample Output 2:
以链表的形式给出两个字符串,其中可能有公共部分,求出公共部分的第一个点的地址。这里跟字母没什么关系,只要用地址就行了。想法就是先建立好链表,然后遍历两个链表找出第一个两个链表都能访问的点。一开始用map做,最后一个case会超时。由于节点地址最多为5位数,所以用数组来储存下一个节点即可,用next表示。然后根据next数组遍历第一个链表,记录哪些点访问过,然后遍历第二个链表,一旦遇到访问过的点就退出循环,输出该点的地址,如果到最后都没遇到访问过的点,即没有公共部分,输出-1.
代码:
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int next[100001];
bool vis[100001];
memset(next,-1,100001);
memset(vis,false,100001);
int a1,a2,n;
scanf("%d %d %d",&a1,&a2,&n);
for (int i=0;i<n;i++)
{
int a,b;
char c;
scanf("%d %c %d",&a,&c,&b);
next[a]=b;
}
int index=a1;
while(index!=-1)
{
vis[index]=true;
index=next[index];
}
index=a2;
while(index!=-1&&!vis[index])
{
index=next[index];
}
if(index==-1)
printf("-1");
else
printf("%05d",index);
}
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
where Address 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
以链表的形式给出两个字符串,其中可能有公共部分,求出公共部分的第一个点的地址。这里跟字母没什么关系,只要用地址就行了。想法就是先建立好链表,然后遍历两个链表找出第一个两个链表都能访问的点。一开始用map做,最后一个case会超时。由于节点地址最多为5位数,所以用数组来储存下一个节点即可,用next表示。然后根据next数组遍历第一个链表,记录哪些点访问过,然后遍历第二个链表,一旦遇到访问过的点就退出循环,输出该点的地址,如果到最后都没遇到访问过的点,即没有公共部分,输出-1.
代码:
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int next[100001];
bool vis[100001];
memset(next,-1,100001);
memset(vis,false,100001);
int a1,a2,n;
scanf("%d %d %d",&a1,&a2,&n);
for (int i=0;i<n;i++)
{
int a,b;
char c;
scanf("%d %c %d",&a,&c,&b);
next[a]=b;
}
int index=a1;
while(index!=-1)
{
vis[index]=true;
index=next[index];
}
index=a2;
while(index!=-1&&!vis[index])
{
index=next[index];
}
if(index==-1)
printf("-1");
else
printf("%05d",index);
}
相关文章推荐
- C#中list用法实例
- C#中Ilist与list的区别小结
- C#中IList<T>与List<T>的区别深入解析
- C#对list列表进行随机排序的方法
- Vc++ 控件List Control用法总结
- C++实现的泛型List类分享
- C#使用IComparer自定义List类实现排序的方法
- C# Datagridview绑定List方法代码
- javascript radio list的实现细节(多浏览器兼容)
- c++ STL容器总结之:vertor与list的应用
- Java中对List集合的常用操作详解
- java实现List中对象排序的方法
- 大家注意vector, list, set, map成员函数erase
- ASP.NET―001:GridView绑定List、页面返回值具体实现
- List all the Databases on a SQL Server
- js Map List 遍历使用示例
- Java比较两个List的值是否相等的方法
- Java List双击事件实现方法
- velocity显示List与Map的方法详细解析
- 关于STL中list容器的一些总结