HDU - 6103 Kirinriki(字符串匹配+思维)

题目大意:

就是给你一个字符串,让你从中选取两个不相交的子串,使得它们在差不超过 m 的前提下尽可能的长,问你最长可能的长度。两个子串的差定义为两个子串一个正向遍历一个同时反向遍历,对应位置字符差的绝对值的和。

分析:

办法就是把所给字符串 a 倒序生成字符串 b ,然后问题就转化成了如何将 a b 字符串匹配才能得到最长的符合要求的匹配长度。那么我的想法就是把 a b 字符串错位,对于每一种错位状况,我用一种类似于尺取法的办法在 O(n) 的之间内,取出可能的最大长度。那么对于大约 2*n 种错位状况,我就能在大约 O( n2 )的时间内求得该问题的解。

代码:

#include<bits/stdc++.h>
#define maxn 5050
using namespace std;

int test=0;
char a[maxn],b[maxn];
int n,m;


int main()
{
    scanf("%d",&test);
    while(test--)
    {
        scanf("%d",&m);
        scanf("%s",a);
        n=strlen(a);
        for(int i=0;i<n;i++)
        {
            b[i]=a[n-i-1];
        }
        int ans=0;
        int best=0,val=0;
        for(int j=0;j<n-1;j++)
        {
            best=0;
            val=0;
            for(int i=0;i<(n-j)/2;i++)//iºÅºÍi+jºÅ±È
            {
                val+=abs(a[i]-b[i+j]);
                if(val>m)
                {
                    val-=abs(a[i-best]-b[i+j-best]);
                    continue;
                }
                best++;
            }
            if(ans<best)
            {
                ans=best;
            }
        }

        for(int j=0;j<n-1;j++)
        {
            best=0;
            val=0;
            for(int i=0;i<(n-j)/2;i++)//iºÅºÍi+jºÅ±È
            {
                val+=abs(b[i]-a[i+j]);
                if(val>m)
                {
                    val-=abs(b[i-best]-a[i+j-best]);
                    continue;
                }
                best++;
            }
            if(ans<best)
            {
                ans=best;
            }
        }

        printf("%d\n",ans);

    }

}

总结:

第六场多校赛了,这一场自认为发挥还是不错。本来开始之前就想吃午饭,但是突然一狠心,还是不吃了,一会要是能 ac 3题就出去吃好的!没够就晚上也不吃了。结果因为怕饿一晚上还是拼命做了3题出来,刚刚吃得还挺爽。
其实感觉这三道都是说不出什么算法,就是比较靠技巧的,主要是看ac人数大概估计了题的难度,少走了好多弯路。主要是对于这一道题,想的时候,我也想到了会不会是要用 dp ,但是这次真的是脑子没敢停(实在是想吃肉了),感觉想到解法的过程是一种类似于广搜的过程,向 dp 的方向想一点,遇到困难再换成暴力的思想,遇到困难想不到的时候,又回去继续想 dp ,然后又找不到合适状态,结果又换成别的方向,反正各个方向都想了一下,但都不是很深,因为我觉得300人 ac 的题真的不应该太复杂。也许是真的有点着急了,不过还是想到了比较简单的办法。后面发现代码能力还是低,几十行的代码,边界就能想乱。(不是原理想不明白,是 i j 从零开始从一开始,奇数偶数想不过来)好在还是ac了这道“吃饭题”。激动地直接去约饭了,也没安排好~
但是感觉最关键的一步是想到要把 a 字符串倒序生成 b 然后放到一起比(虽然部分区域无法取到),如果只是想把一个字符串分两个合适的部分,而把这个问题看成是在一串数中找两个子串的合适的边界位置的话,感觉就很难想出结果了,因为这样很难有效利用字符串长度相同这个条件。

全部评论

相关推荐

牛客87317764...:然后客户端边学边投,学个1个月投不进去都是正常的,这玩意非常看运气
投递快手等公司9个岗位
点赞 评论 收藏
分享
最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务