Codeforces Round #215 (Div. 1) <A-B>

来源:互联网 发布:淘宝店信用怎么提高 编辑:程序博客网 时间:2024/04/29 18:19

367A. Sereja and Algorithm

题目链接:

http://codeforces.com/problemset/problem/367/A

题目意思:

判断一个串,有没有几率跳出以下算法循环。

1、在该串中找不包含"zyx”,"xzy","yxz"的任意一个包含三个字符的字符串,如果找不到则跳出去,否则跳到第二步执行。

2、将这三个字符串随机的重新排序,然后跳到1.

解题思路:

分析知,如果x,y,z不全包含,肯定能找到,也就跳不出去。否则分析之zyxzyyxz 形成一条链。只要任意两个字符的个数差小于2就可以凑成。

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<sstream>#include<cstdlib>#include<string>#include<string.h>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#include<bitset>#define eps 1e-6#define INF 0x3f3f3f3f#define PI acos(-1.0)#define ll __int64#define LL long long#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#define M 1000000007#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define Maxn 110000struct Inf{    int a,b,c;}inf[Maxn];char save[Maxn];int main(){   //freopen("in.txt","r",stdin);   //freopen("out.txt","w",stdout);   while(~scanf("%s",save+1))   {       int n=strlen(save+1),m;       inf[0].a=inf[0].b=inf[0].c=0;       for(int i=1;i<=n;i++)       {           inf[i]=inf[i-1];           if(save[i]=='x')                inf[i].a++;           else if(save[i]=='y')                inf[i].b++;           else                inf[i].c++;       }       scanf("%d",&m);       for(int i=1;i<=m;i++)       {           int li,ri;           scanf("%d%d",&li,&ri);           int a,b,c;           a=inf[ri].a-inf[li-1].a;           b=inf[ri].b-inf[li-1].b;           c=inf[ri].c-inf[li-1].c;           if(a+b+c<3)           {               printf("YES\n");               continue;           }           if(!a||!b||!c)           {              printf("NO\n");               continue;           }           if(abs(a-b)>=2||abs(a-c)>=2||abs(b-c)>=2)                printf("NO\n");            else                printf("YES\n");       }   }   return 0;}


367B. Sereja ans Anagrams

题目链接:

http://codeforces.com/problemset/problem/367/B

题目意思:

给两个数组a,b。大小分别为n,m.给一个p.

在数组a中每隔p个得到一个序列,求该序列中有多少个与b数组元素一模一样,不考虑元素顺序。

解题思路:

先按%p分组,放到vector里面。

m>ceil(n/p) (最大队列的长度)剪枝。

用map判断两个数组元素是否一样。

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<sstream>#include<cstdlib>#include<string>#include<string.h>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#include<bitset>#define eps 1e-6#define INF 0x3f3f3f3f#define PI acos(-1.0)#define ll __int64#define LL long long#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#define M 1000000007#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define Maxn 210000int a[Maxn],b[Maxn];int n,m,p,num,num1;vector<int>myv[Maxn];vector<int>ans;map<int,int>myp1,myp2;int main(){   //freopen("in.txt","r",stdin);   //freopen("out.txt","w",stdout);   while(~scanf("%d%d%d",&n,&m,&p))   {       for(int i=0;i<n;i++)            myv[i].clear();       myp1.clear();       myp2.clear();       ans.clear();       num1=0;       for(int i=0;i<n;i++)       {           scanf("%d",&a[i]);           myv[i%p].push_back(i);       }       if(m>ceil(n*1.0/p)) //可行性剪枝       {           for(int i=0;i<m;i++)           {               int temp;               scanf("%d",&temp);           }           printf("0\n");           continue;       }       for(int i=0;i<m;i++)       {           scanf("%d",&b[i]);           myp1[b[i]]--;  //b中元素           if(myp1[b[i]]==-1) //多少个不为0的               num1++;       }       for(int i=0;i<p;i++)       {           myp2=myp1; //赋值给myp2           num=num1;           if(myv[i].size()<m)                continue;           for(int j=0;j<m;j++) //先把前m个加进来           {               int ff=myv[i][j];               myp2[a[ff]]++;               if(!myp2[a[ff]]) //填充好的的个数                    num--;               else if(myp2[a[ff]]==1)                    num++;           }           int fi=0;           if(!num)               ans.push_back(fi*p+i+1); //注意下标位置           for(int j=m;j<myv[i].size();j++) //后面的元素 加一个减一个           {               int ff=myv[i][j];               myp2[a[ff]]++; //加               if(myp2[a[ff]]==1)                    num++;               else if(!myp2[a[ff]])                     num--;               ff=myv[i][fi];               myp2[a[ff]]--; //减               if(!myp2[a[ff]])                    num--;               else if(myp2[a[ff]]==-1)                    num++;               fi++;               if(!num)                   ans.push_back(fi*p+i+1);           }       }       sort(ans.begin(),ans.end()); //排序输出       printf("%d\n",ans.size());       for(int i=0;i<ans.size();i++)            printf("%d ",ans[i]);        putchar('\n');   }   return 0;}/*68 16 35 3 4 3 3 3 2 2 2 3 2 4 2 2 2 2 4 3 5 1 1 2 2 2 3 1 5 1 2 2 1 5 1 5 3 2 3 5 2 1 1 4 2 3 4 3 4 3 3 1 3 4 1 5 2 5 3 4 4 1 4 5 5 1 1 2 2 25 4 4 3 5 1 1 2 3 2 2 1 3 3 2 232 13 15*/





原创粉丝点击