GG的匹配串 ______(广东工业大学2015校赛初赛)

Description

2015年广东工业大学ACM校赛要来~\(≧▽≦)/~辣辣辣,作为校赛的出题人之一,GG想出了一道水题来考考大家。相信小伙伴们都学过字符串匹配,于是字符串匹配的水题就诞生辣!GG给出了一段长度为N的大写字母序列,现在他要你修改这一段字母序列,使得这段字母序列上最前面的K个字母组成的序列与最后面的K个字母组成的序列一一匹配。

例如对于序列“ATUUUUAC”和K = 2,可以通过将第二个字母修改为“C”,使得最前面的两个字母与最后面的两个字母都为“AC”,当然 还存在其他的修改方法,现在GG要求你求出要使字符串匹配至少需要修改多少个字母。

Input

有T组数据输入。(T <= 100)

每组数据只有两行,第一行为一个字符串,第二行为一个正整数K,字符串的长度不会超过1000,且至少为1。(1 <= K <= N)。

Output

对于每组数据输出至少需要修改的字母数量

Sample Input

2

ATUUUUAC

2

ATACGTCT

6

Sample Output

1

3

题意:这道题可能有的人读不懂题意,修改字符的时候可能会影响到前后俩个子串的字符,所以第二个样例数据虽然前后两个子串有4个字符不匹配,但是只需要改3次.

分析:假设 n=8,k=6;

图中用线连起来的就是要相同的.

我们发现每隔 n-k  字符都要相同,那么我们就只需要对于每个i ,下标为 i + m * (n-k) 的字符中出现次数最多的字母为 ‘ * ‘ ,那么我们就把 i + m * (n-k)这些字符全部改为 ‘ * ‘ ;

这也算是一个贪心的思想.

上代码:

#include <stdio.h>
#include <string.h>
char str[10000];
int N,n,j,k,m,a[26];
int find(int x)
{
    int c=0;
    memset(a,0,sizeof(a));
    while(x<n)
    {
        a[str[x]-'A']++;
        x=x+m;
        c++;
    }
    int max=0;
    for(int i=0;i<26;i++)
        max=(max>a[i])? max:a[i];
    return c-max;
}
int main()
{
    scanf("%d",&N);
    while(N--)
    {
        scanf("%s",str);
        scanf("%d",&k);
        n=strlen(str);
        m=n-k;
        int ans=0;
        for(int i=0;i< k && i< m;i++)
        {
            ans+=find(i);
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-08-07 09:05:23

GG的匹配串 ______(广东工业大学2015校赛初赛)的相关文章

ACM学习历程—广东工业大学2016校赛决赛-网络赛F 我是好人4(数论)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=5 这个题目一看就是一道数论题,应该考虑使用容斥原理,这里对lcm进行容斥. 不过直接上去是T,考虑到序列中同时存在i和ki的话,其实只需要考虑i,所以先对序列中为倍数的对进行处理. 这里的容斥用了hqw的写法. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #includ

ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4 这个题目自然会考虑到去讨论最长或者最短的板子. 笔上大概模拟一下的话,就会知道,假设最长的板子是r,0和n+1位置上都是高度为0的板子,那么对于[0, r-1]中的最长板子rr,rr到r这一短应该都是被深度为a[rr]的水覆盖.同样的[0, rr-1]中的最长板子rrr,rrr到rr这一段应该是被a[rrr]覆盖,以此类推可以搞定r的前面一段,同理搞定后一段. 关于最值这一块,

ACM学习历程—广东工业大学2016校赛决赛-网络赛D 二叉树的中序遍历(数据结构)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=3 这算是一个胡搞类型的题目.当然肯定是有其数据结构支撑的. 唯一的限制就是不能出现连续的两个’#’. 因为如果我从左到右构造这棵树,那么假设我构造到第i个, 如果i+1是数字,那么把前i个构成的子树作为i+1的左儿子即可. 如果i+1是’#’,那么把’#’当成i的右儿子即可. 所以只要没有两个连续的’#’,自然能通过上面的方法构造. 但是如果出现两个连续的’#’,自然前一个’#’

ACM学习历程—广东工业大学2016校赛决赛-网络赛C wintermelon的魔界寻路之旅(最短路 &amp;&amp; 递推)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=2 题目由于要找对称的路径,那么狠明显可以把右下角的每一块加到左上角对应的每一块上.然后就变成从左上角走到对角线的最短路径的个数. 先跑一遍最短路径得到p(i, j)从起点到(i, j)的最短路径. 然后就是找最短路径的个数.显然cnt(i, j)是它周围点能通过最短路径到它的cnt的和.这一处可以使用记忆化搜索来完成. 代码: #include <iostream> #

广东工业大学2015新生赛round2(//自己脑洞堵了,madan!)

Path:新生赛 A.Number Sequence Description: A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Analyse: 自动找周期法. CODE: int main() { int a,b,n;

2015广东工业大学ACM校赛 I 游戏王 (状压dp)

Problem I: 游戏王 Description 小学的时候,Stubird非常喜欢玩游戏王,有一天,他发现了一个绝佳的连锁组合,这个连锁组合需要6张卡, 可是他一张都没有,但是他的那些朋友们有,不过当然,他们不会白给,不过也不排除有人和他交情好,送给他了. 不过他们有成全别人的美德,当他们看到Stubird已经有某些他们喜欢的卡的时候,他们会给他优惠,或者更贵也说不定 嘛不过,你可以把有的卡片藏起来,不告诉他们,来获得更低的价格. 问他最少需要多少钱才可以集齐所有的卡. Input 第一行

广州工业大学2016校赛 F 我是好人4 dfs+容斥

Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍数 最后友情提供解题代码(我真是太好人了) void solve(int p[], int n) { int ans = 0; for (int i = 1; i <= 1e9; i++) { int fl = 0; for (int j = 0; j < n; j++) { if (i % p[

河南工业大学2017校赛题解

问题 A: 饶学妹的比赛 题意: 给你一场比赛每人提交的记录,计算最后的排名 题解: 模拟+排序 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6 #include <cstdio> 7 #include <string> 8 #include <vector> 9 #

广工校赛——GG的匹配串

Description 2015年广东工业大学ACM校赛要来~\(≧▽≦)/~辣辣辣,作为校赛的出题人之一,GG想出了一道水题来考考大家.相信小伙伴们都学过字符串匹配,于是字符串匹配的水题就诞生辣!GG给出了一段长度为N的大写字母序列,现在他要你修改这一段字母序列,使得这段字母序列上最前面的K个字母组成的序列与最后面的K个字母组成的序列一一匹配.  例如对于序列“ATUUUUAC”和K = 2,可以通过将第二个字母修改为“C”,使得最前面的两个字母与最后面的两个字母都为“AC”,当然 还存在其他