CF591CF01串的变换,找规律

来源:互联网 发布:网络直销三生公司 编辑:程序博客网 时间:2024/05/22 20:41

这题知道应该是一个规律题,然而并没有什么卵用,规律找不到,AC不了,前面俩题手速不够快,只能掉rating。

说一下这题的规律:

首先只有101和010会变化,很明显可以知道,然后开个数组,记录需要变化的位置,

然后每一段需要变化的01串需要交换的次数为:len+1/2;

然后变化的规律:

  • 若子串长度len为奇数,即首尾数字相同的,该子串变为同样长度,与首尾数字一致的串,如10101变为11111,而01010变为00000
  • 若子串长度len为偶数,即首尾数字不同,子串中每个数字会变为与首尾数字中与其距离较近的一个,如101010变为111000,而01010101变为00001111,
具体细节看代码:
另外贴下B题的代码,写的比较繁琐,求喷。
C题:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<set>#include<cmath>#include<climits>#include<vector>#include<cfloat>#include<queue>#include<cctype>#include<cstdlib>#include<string>#define LL long longusing namespace std;const int N=500010;int a[N],b[N];int main(){    int n;   while(cin>>n)   {       for(int i=0;i<n;i++)        scanf("%d",&a[i]);       memset(b,0,sizeof(b));       for(int i=1;i<n-1;i++)        b[i]=a[i]!=a[i-1]&&a[i]!=a[i+1];        int ans=0;        int i=1;        while(i<n-1)        {            if(!b[i]) i++;            else            {                int j=i;                while(b[j]) j++;                ans=max(ans,(j-i+1)/2);                if((j-i)%2) for(int k=i;k<j;k++) a[k]=a[i-1];                else                    for(int k=i;k<j;k++) a[k]= (k<(i+j)/2) ?a[i-1]:a[j];                i=j;            }        }        cout<<ans<<endl;        for(int i=0;i<n-1;i++)            cout<<a[i]<<' ';        cout<<a[n-1]<<endl;   }    return 0;}
B题:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<set>#include<cmath>#include<climits>#include<vector>#include<cfloat>#include<queue>#include<cctype>#include<cstdlib>#include<string>#define LL long longusing namespace std;const int maxn=40;int s[30];int main(){   int n,m;   while(cin>>n>>m)   {       string ss;       cin>>ss;       memset(s,0,sizeof(s));       for(int i=0;i<m;i++)       {           char x,y;           cin>>x>>y;           int x1=x-'a'+1;           int y1=y-'a'+1;           if(x1==y1)            continue;           for(int i=1;i<30;i++)           {               if(s[i]==x1)               {                   s[i]=y1;                   continue;               }               if(s[i]==y1)               {                   s[i]=x1;                   continue;               }           }           if(!s[x1])           s[x1]=y1;           if(!s[y1])            s[y1]=x1;       }       //cout<<ss<<endl;       for(int i=0;i<ss.length();i++)       {           int t=ss[i]-'a'+1;           if(s[t])            printf("%c",s[t]-1+'a');           else            cout<<ss[i];       }       cout<<endl;   }    return 0;}





0 0
原创粉丝点击