您的位置:首页 > 其它

ACM暑假集训日记 17.8.3

2017-08-03 21:37 204 查看
今天忙活了一天,也没写出几个题来,下午又有一场网络赛,前二十分钟A出了第一道题,后面的两个多小时,竟是一道都没有再做出来,被那题目描述困扰了半天,心情比较郁闷,晚上主要是看了一下两道网络赛的题目的题解,有一个用到了一个取尺法,看了半天感觉真的是挺巧妙地,感觉自己掌握的算法太少了,二期就算是学过的算法,用起来也不是多么熟练,以后还是要多做题,来锻炼自己运用算法的能力才行。

在这里再写一遍今天看的取尺法吧

用一个比较常见的例子来说明一下:

对于一个串 aabccccdfe 求出连续的(字母相同)最长的串;

#include<bits/stdc++.h>

using namespace std;

int main()

{

    char a[100];

    int i,j;

    gets(a);

    int len=strlen(a);

    int ans=0;

    for(i=0;i<len;i=j+1)

    {

        for(j=i;j+1<len&&a[i]==a[j+1];j++);

        ans=max(ans,j-i+1);

    }

    cout<<ans<<endl;

}

然后对于今天的第三题

给一个串,问在有限次改变字母的情况下,能得到的最长连续长度是多少;

也可以用取尺法的思想;

把给定的长度设为k,看做是一个尺子,每次量取不能超过k;

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+10;

const int mod=1e7+9;

int i,j,n,m,k,mx,x,y,l,r,b;

char c,s[2000];

int main()

{

    scanf("%d",&n);

    scanf("%s",s+1);

    scanf("%d",&m);

    for (i=1;i<=m;i++)

    {

        scanf("%d %c",&b,&c);

        mx=0; l=1; k=0;

        for (r=1;r<=n;r++)

        {

            if (s[r]!=c) k++;

            while (k>b)

            {

                if (s[l]!=c) k--;

                l++;

            }

            mx=max(mx,r-l+1);

        }

        cout<<mx<<endl;

    }

}

取尺法一开始看了半天才看懂,不过掌握了一个挺实用的方法,也是一个不小的收获。

明天还是要继续做那几道搜索题= =,哎,真是有些头疼
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: