uva10152-龟壳排序

小白书里数据结构基础线性表的训练参考 题目都是从uva中取的

题目连接 http://acm.hust.edu.cn/vjudge/problem/19299

virtual judge 里有,可以去注册。

解题思路

试着解样例,会得到这样的经验:

  找到目标序列中第一个匹配不到的名字(从初始序列中的上一个匹配的位置找起)。把这个名字从初始位置拉到栈顶。

  重复直到目标序列全部匹配。

注 匹配是指一次扫描序列,指针不回头。

用这个思路写代码,交上去AC了。为什么这样的步数最少呢?每次把不匹配的名字从初始位置拉倒栈顶,总的匹配数加一,而且不可能减少,因为你是从序列

开头一个一个匹配的。有没可能一次移动后匹配数增加不止一呢?也不可能(想一想为啥)。

代码中我是用动态的单链表模拟乌龟们的。

哦,对了。读入数据的时候记得把所有的空格吃掉。。。别以为一个getchar()就吃掉了,可能有很多个空格。。。

代码:

#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
//#define LOCAL
typedef struct node {
    char s[90];
    struct node *next;
}Node;
void Add(Node *first, Node *&rear)
{
    Node *temp = new Node;
    gets(temp->s); temp->next = first->next;
    first->next = temp;
    if(rear->next != NULL) rear = rear->next;
}
void DeleteAdd(char *s, Node *f, Node *&r)
{
    Node *p = f->next, *pre = f;
    while(p != NULL && strcmp(s, p->s)) { pre = p; p = p->next; }
    pre->next = p->next;
    r->next = p;
    r = p;
    p->next = NULL;
}
void doIt(Node *firstR, Node *&rearR, Node *firstT, Node *&rearT)
{
    Node *rawf = firstR;
    Node *targetf = firstT;
    Node *rawr = rearR;
    Node *targetr = rearT;
    Node *pr, *pt;
    pr = rawf->next; pt = targetf->next;
    while(pt != NULL) {
        while(pr != NULL && strcmp(pr->s, pt->s)) pr = pr->next;
        if(pr == NULL) {
            cout << pt->s << endl;
            DeleteAdd(pt->s, rawf, rearR);
            pr = rawf->next; pt = targetf->next;
        }
        else pt = pt->next;
    }
}
void Delete(Node *f)
{
    Node *p;
    while(p!=NULL) { f = f->next; delete p; p = f; }
}
int main()
{
    #ifdef LOCAL
        freopen("data.txt", "r", stdin);
        freopen("ans.txt", "w", stdout);
    #endif
    int n;
    scanf("%d", &n);
    while(n--) {
        Node *firstR = new Node; firstR->next = NULL;
        Node *rearR = firstR;
        Node *firstT = new Node; firstT->next = NULL;
        Node *rearT = firstT;
        int number;
        scanf("%d", &number);
        char c;
        while(c = getchar()!=‘\n‘) ;
        for(int i=0; i<number; i++)
            Add(firstR, rearR);
        for(int i=0; i<number; i++)
            Add(firstT, rearT);
        doIt(firstR, rearR, firstT, rearT);
        Delete(firstR); Delete(firstT);
        cout << endl;
    }
    return 0;
}
时间: 2024-10-21 00:04:21

uva10152-龟壳排序的相关文章

UVa 10152 龟壳排序

思路:先读入的一列是原始串,后读入的一列是目标串.最少操作次数的方式是,从下到上,只对原始串进行删除而不放到最上面能得到的目标串的以最下元素开头的最长子串,然后将目标串剩余的那些按序放在最上方,即按由下到上的顺序输出即可. Code: //#define LOCAL #include<stdio.h> #include<stdlib.h> #include<string.h> char name[210][90]; char target[210][90]; //cha

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定