【NOIP模拟】 (10.26) T1 抄代码

抄代码

题目描述:(应出题人要求不传播)

解析:
       一道简单的模拟题,但有不少坑点,考虑问题要全面。
       对于这道题,有这几点值得注意:
       1.两个代码的长度需相等,不等则不成立
       2.两个代码中非字母字符应对应相等,不等则不成立
       3.J君代码中的相同字母对应C君中的字母应相等,不等则不成立

       其实这道题出题人忽略了一种情况:
       J:abcdef......xyz
       C;zyx......fedcba
       如果是这种情况,那么题解的方法就会出错,因为题解没有考虑交换当前字母时对先前的影响, 所以很多不完善的代码也能AC,不过也不清楚出题人是怎么想的,所以就暂且忽略这种情况。

代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
#include <string>
#include <queue>
#include <ctime>
using namespace std;

const int Max=1010;
int t,num[30];
int pos[30][Max];
char ch1[Max],ch2[Max];

inline int get_int()
{
   int x=0,f=1;
   char c;
   for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
   if(c=='-') {f=-1;c=getchar();}
   for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
   return x*f;
}

inline void clean()
{
   memset(num,0,sizeof(num));
   memset(pos,0,sizeof(pos));
}

inline int pan(int len)
{
//判断如果一个是字母一个是非字母或这两个非字母字符不相等
   for(register int i=1;i<=len;i++)
   {
   	 int x=0,y=0;
   	 if(ch1[i]>='a'&&ch1[i]<='z') x=1;
   	 if(ch2[i]>='a'&&ch1[i]<='z') y=1;
   	 if((x!=y)||(x==0&&y==0&&ch1[i]!=ch2[i])) return 1;
   }

   for(register int i=1;i<=len;i++)
     if(ch1[i]>='a'&&ch1[i]<='z')
       pos[ch1[i]-'a'][++num[ch1[i]-'a']]=i;   //f[i][j]表示字符i在J串中出现第j次时的位置

   int x=0;
   for(register int i=0;i<=25;i++)
   {
   	 if(num[i]>=2)
   	   for(register int j=2;j<=num[i];j++)
   	   {
   	   	 if(pos[i][j]==0) break;
   	   	 if(ch2[pos[i][j]]!=ch2[pos[i][j-1]]) x=1;
   	   }
   }
   if(x==1) return 1;
   else return 0;
}

int main()
{
   freopen("copycat.in","r",stdin);
   //freopen("copycat.out","w",stdout);

   scanf("%d\n",&t);
   while(t--)
   {
   	 clean();
   	 gets(ch1+1);
   	 int len1=strlen(ch1+1);

   	 gets(ch2+1);
   	 int len2=strlen(ch2+1);

   	 if(len1!=len2) {cout<<"0"<<endl;continue;}
   	 if(pan(len1)) cout<<"0"<<"\n";
   	 else cout<<"1"<<"\n";
   }

   return 0;
}

       注意!!!
       用gets读入后不用再读入换行符!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值