2021组队训练赛第11场

简介: ==**我们的终极目标不是AC,而是获取经验**==问题 A: ABB题意考点问题 C: Bob in Wonderland题意考点问题 F: Zeldain Garden题意考点问题 G: Light Emitting Hindenburg题意考点问题 H: K == S题意考点问题 I: Ponk Warshall题意考点

我们的终极目标不是AC,而是获取经验


问题 A: ABB


题意


给定长度为n的字符串,在给定的字符串后面加上长度最短的字符串,使得到的字符串回文,求最少添加几个字符


考点


字符串哈希 or 马拉车算法(Manacher)


const ll inf = 1e15;
const ll INF = 0x3f3f3f3f;
const int MAXN = 410010;
char A[MAXN * 2];
int B[MAXN * 2];
void Manacher(char s[], int len)
{
    int l = 0;
    A[l++] = '$';//0下标存储为其他字符
    A[l++] = '#';
    for (int i = 0; i < len; i++)
    {
        A[l++] = s[i];
        A[l++] = '#';
    }
    A[l] = 0;//空字符
    int mx = 0;
    int id = 0;
    for (int i = 0; i < l; i++)
    {
        B[i] = mx > i ? min(B[2 * id - i], mx - i) : 1;
        while (A[i + B[i]] == A[i - B[i]])
        {
            B[i]++;
        }
        if (i + B[i] > mx)
        {
            mx = i + B[i];
            id = i;
        }
    }
    return;
}
int n;
char s[MAXN];
bool judge() {
    int l = 0, r = n - 1;
    int flag = 0;
    while (l <= r) {
        if (s[l] == s[r]) {
            l++;
            r--;
            continue;
        }
        else {
            flag = 1;
            break;
        }
        l++;
        r--;
        if (l == r) break;
    }
    if (flag) return false;
    return true;
}
int main()
{
    cin >> n;
    cin >> s;
    int len = (int)strlen(s);
    if (judge()) {
        puts("0");
        return 0;
    }
    Manacher(s, len);
    int ans = 0;
    int pos = 0;
    int siz = 2 * len + 1;
    for (int i = 0; i < 2 * len + 1; i++) {
        if (B[i] >= siz - i) {
            if (i % 2) {
                pos = max(pos, (B[i] - 1));
            }
            else
            {
                pos = max(pos, (B[i] - 1) / 2 * 2 + 1);
            }
        }
    }
    if (pos == 0) cout << n - 1 << endl;
    else cout << n - pos << endl;
    return 0;
}
/*
6
abcdcb
*/


问题 C: Bob in Wonderland


题意


将一个树形结构变成链,求出操作的次数(每次可以删除一条边)


考点


从度的角度可以很好的操作,代码很简短

const int N = 300010;
int d[N];
int main()
{
    int n; scanf("%d", &n);
    for (int i = 1;i < n;i++)
    {
        int x, y; scanf("%d%d", &x, &y);
        d[x]++, d[y]++;
    }
    int res = 0;
    for (int i = 1;i <= n;i++)
    {
        if(d[i] >= 2)
        res += d[i] - 2;
    }
    cout << res;
    return 0;
}
/**************************************************************
    Problem: 14241
    User: 我就不告诉你哈哈哈
    Language: C++
    Result: 正确
    Time:94 ms
    Memory:3196 kb
****************************************************************/


问题 F: Zeldain Garden


题意


考点


整数分块叭

计算出

x/1+x/2+x/3+x/4…+x/x即为答案,计算为下取整

typedef long long ll;
ll get(ll x)
{
    ll res = 0;
    for (ll l = 1, r;l <= x;l = r + 1) {
        r = x / (x / l);
        res += (r - l + 1) * (x / l);
    }
    return res;
}
int main()
{
    ll l, r; scanf("%lld%lld", &l, &r);
    ll ans = get(r) - get(l - 1);
    printf("%lld", ans);
    return 0;
}
/**************************************************************
    Problem: 14244
    User: 我就不告诉你哈哈哈
    Language: C++
    Result: 正确
    Time:119 ms
    Memory:2024 kb
****************************************************************/


问题 G: Light Emitting Hindenburg


题意


这个题不是我参与写的可以询问大佬


考点


据说是个贪心

代码仅从参考

虽然没代码,但是可以私信


问题 H: K == S


题意


考点


AC自动机 + 矩阵快速幂


问题 I: Ponk Warshall


/doge这个是我写的


题意


给出两个字符串,从上面字符中选取任意两个来进行交换,从上面的字符串得到下面的字符串,最少的操作步数是多少?


考点


思维 + 暴力

const ll inf = 1e15;
const ll INF = 0x3f3f3f3f;
string s, t;
map<char, int> mp;
int a[5][5];
int a1[1000007];
int a2[1000007];
int main()
{
    cin >> s;
    cin >> t;
    mp['A'] = 1, mp['C'] = 2, mp['G'] = 3, mp['T'] = 4;
    int len = s.size();
    for (int i = 0; i < len; i++) {
        a1[i] = mp[s[i]];
        a2[i] = mp[t[i]];
    }
    for (int i = 0; i < len; i++) {
        if (s[i] != t[i]) {
            a[a1[i]][a2[i]] += 1;
        }
    }
    ll ans = 0;
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= 4; j++) {
            int mini = min(a[i][j], a[j][i]);
            ans += mini;
            a[i][j] -= mini;
            a[j][i] -= mini;
        }
    }
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= 4; j++) {
            for (int k = 1; k <= 4; k++) {
                int mini = min(a[i][j], min(a[j][k], a[k][i]));
                ans += 2 * mini;
                a[i][j] -= mini;
                a[j][k] -= mini;
                a[k][i] -= mini;
            }
        }
    }
    //方式1:
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= 4; j++) {
            for (int k = 1; k <= 4; k++) {
                for (int t = 1; t <= 4; t++) {
                    int mini = min(a[i][j], min(min(a[j][k], a[k][t]), a[t][i]));
                    ans += 3 * mini;
                    a[i][j] -= mini;
                    a[j][k] -= mini;
                    a[k][t] -= mini;
                    a[t][i] -= mini;
                }
            }
        }
    }
    //方式2:
    for (int i = 1; i <= 4; i++) ans += 3 * a[i][2];
    //ps:a[i][x],1<=x<=4均可
    cout << ans << endl;
    return 0;
}
/*
*/
/**************************************************************
    Problem: 14247
    User: 我就不告诉你哈哈哈
    Language: C++
    Result: 正确
    Time:317 ms
    Memory:15700 kb
****************************************************************/
目录
相关文章
|
5月前
|
安全
嫦娥六号成功带回月球背面土壤,嫦娥七号整装待发,2030年前实现载人登月!
嫦娥六号成功返回,首次实现月球背面采样,标志中国航天新成就;嫦娥七号计划2026年前后发射,目标月球南极,寻找水冰证据,多国科学载荷参与,展现国际合作;嫦娥八号将助力月球科研站建设,中国载人登月计划预计2030年前实现。🚀🌙✨
104 0
|
人工智能 算法 BI
第320场周赛赛后分析总结(前三题)
前言 几个星期没打周赛,手感生疏了好多,果然算法题还是得勤加练习,多找适应比赛的感觉。 同时,第二、三题都是图和树相关的内容,像我这种对这个专题还不熟的也可以借此机会巩固一下。
97 0
L1-079 天梯赛的善良 (20 分)
L1-079 天梯赛的善良 (20 分)
219 0
7-7 天梯赛的善良 (20 分)
7-7 天梯赛的善良 (20 分)
283 0
|
网络架构
运动会-组合数学
题目描述 在一次运会上,有一个比赛项目,共有N个人参加比赛,要将这N个人分组,每组人数不少于K个,问有多少种分组方式? 比如有16个运动员,每组人数不少于5个,共有6种分组方式: (1) 分一组,为16人; (2) 分二组,分别为11人、5人; (3) 分二组,分别为10人、6人; (4) 分二组,分别为9人、7人; (5) 分二组,分别为8人、8人; (6) 分三组,分别为6人、5人、5人。 注意:6+5+5,5+6+5,5+5+6为同一种,只算一种分组方式; 输入 输入共一行为两个整数N, K。表示有N个运动员分组,每组不少于K个人(1 ≤ K ≤ N ≤ 500)。
182 0
团体程序设计天梯赛-练习集 - L2-028 秀恩爱分得快(25 分)
团体程序设计天梯赛-练习集 - L2-028 秀恩爱分得快(25 分)
262 0
中南大学2012暑期集训中期检测训练赛-求逆元
给定正整数x,y,求最小的正整数z使得x*z mod y = 1。
104 0
|
安全 开发者
最酷的黑客马拉松地点?30000英尺的高空
说到黑客马拉松,你很容易想起这些:拿着不放的手机,随处开着放在桌上的笔记本,当然还有互联网连接。但是英国航空公司”不接地创新实验室“中的开发者可没有这些东西,他们在空中进行了11个小时的黑客马拉松。
191 0
最酷的黑客马拉松地点?30000英尺的高空
下一篇
DataWorks