抄代码
题目描述:(应出题人要求不传播)
解析:
一道简单的模拟题,但有不少坑点,考虑问题要全面。
对于这道题,有这几点值得注意:
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读入后不用再读入换行符!!!