IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 最小表示法,构造和打表 -> 正文阅读

[C++知识库]最小表示法,构造和打表

最小表示法

说来也不难,最小表示法,就是给你一个环型的字符串,然后你把它从任意位置,破圆成链,然后在形成的不同的串中,找到字典序最小的那一个。

我们的做法就是,把字符串延长一倍,然后用两个指针,一个从0开始,一个从1开始,往后比较每一个长度为n的字符串,这里设为指针i, j。

比较的时候直接暴力比较,如图
在这里插入图片描述
先比较第一个,如果相同就比较下一个,如果不同的话,就让大的那个指针,往后移,假设是第k个不一样,i = i + k + 1;因为这期间从i到k里面,每一个都会有一个对应的字符串,而且在k那个位置比它小,所以要从k+1开始再次比较

如果找到了俩串一样,并且i != j,这时候就说明原串是一个循环串,并且i和j之间就是第一个循环节,而且已经枚举过了。如果是一个循环串,那么不同的起点只有一个循环节这么多,从下个循环节就又重复了,这个时候就能直接break了

项链

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 2000010;

int n;
char a[N], b[N];

int get_min(char s[])
{
    int i = 0, j = 1;
    while (i < n && j < n)
    {
        int k = 0;
        while (k < n && s[i + k] == s[j + k]) k ++ ;//比较
        if (k == n) break;//如果俩串一样,就break
        if (s[i + k] > s[j + k]) i += k + 1;
        else j += k + 1;//就是刚刚推到的
        if (i == j) j ++ ;//如果相同的话,没必要比较比较了可能还会误导
    }
    int k = min(i, j);
    s[k + n] = 0;
    return k;
}

int main()
{
    scanf("%s%s", a, b);
    n = strlen(a);
    memcpy(a + n, a, n);
    memcpy(b + n, b, n);

    int x = get_min(a), y = get_min(b);
    if (strcmp(a + x, b + y)) puts("No");
    else
    {
        puts("Yes");
        puts(a + x);
    }

    return 0;
}

构造

直接给两个例题吧,一般这种题都是在一个数学结论基础上搞出来的

神奇的幻方

简单的原因是因为给出来构造方法了

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 40;

int n;
int a[N][N];

int main()
{
    cin >> n;

    int x = 1, y = n / 2 + 1;
    for (int i = 1; i <= n * n; i ++ )
    {
        a[x][y] = i;
        if (x == 1 && y == n) x ++ ;
        else if (x == 1) x = n, y ++ ;
        else if (y == n) x --, y = 1;
        else if (a[x - 1][y + 1]) x ++ ;
        else x --, y ++ ;
    }

    for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= n; j ++ ) printf("%d ", a[i][j]);
        puts("");
    }

    return 0;
}

时态同步

意思就是要让子节点到根节点的时间都一样,如果你上来就想算出来从根节点到每个子节点的时间,然后用最大的求差累加的话,是错的,因为有可能,不同的子节点共用了一段路,这时候,只需要给这段路加上一些时间就可以了,不用累加多次

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
const int N = 500010, M = N * 2;

int n, root;
int h[N], e[M], w[M], ne[M], idx;
LL d[N], ans;

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int u, int father)
{
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == father) continue;
        dfs(j, u);
        d[u] = max(d[u], d[j] + (LL)w[i]);
    }
    
    
    // d[u] += d[e[h[u]]];
    
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == father) continue;
        ans += d[u] - (d[j] + w[i]);
    }
}

int main()
{
    scanf("%d%d", &n, &root);
    memset(h, -1, sizeof h);
    for (int i = 0; i < n - 1; i ++ )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }

    dfs(root, -1);
    printf("%lld\n", ans);

    return 0;
}

打表

打表题的注意事项1.尽早做,2.压缩代码长度

打表题目一般有几个特点
1.输入的种类很少(全部打表)
2.用代码处理一部分(部分打表)
3.配合打表,代码中某些部分,尤其是预处理 ,如果满足(1.可能会TLE,2.代码太长,3.容易手算,4是固定的),比如矩阵乘+快速幂的问题,状态压缩,数位dp,字符串处理的题目

邮政货车

不太会,先鸽了

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-27 17:12:03  更:2022-05-27 17:13:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 19:15:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码