有好几天没有在POJ上做题了,今天随便找了一道水题POJ2159来做。但是在做的时候有一点小疑惑,虽然最后AC了,但是个人感觉结果是错误的,包括OJ的判定也是错的。
先把源代码贴出来再说吧:
Code
#include <iostream>
#define MAX 101
using namespace std;
int swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
return 0;
}
int main()
{
char cha[MAX],chb[MAX];
int a[26]={0},b[26]={0},i,j;
cin >> cha;
cin >> chb;
if(strlen(cha) != strlen(chb))
{
cout << "NO" << endl;
return -1;
}
for(i=0;i<MAX && cha[i]!='\0';i++)
{
a[cha[i]-'A']++;
b[chb[i]-'A']++;
}
for(i=0;i<25;i++)
for(j=i+1;j<26;j++)
{
if(a[i]>a[j])
swap(&a[i],&a[j]);
if(b[i]>b[j])
swap(&b[i],&b[j]);
}
for(i=0;i<26;i++)
if(a[i]!=b[i])
{
cout << "NO" << endl;
return -1;
}
cout << "YES" << endl;
return 1;
}
#include <iostream>
#define MAX 101
using namespace std;
int swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
return 0;
}
int main()
{
char cha[MAX],chb[MAX];
int a[26]={0},b[26]={0},i,j;
cin >> cha;
cin >> chb;
if(strlen(cha) != strlen(chb))
{
cout << "NO" << endl;
return -1;
}
for(i=0;i<MAX && cha[i]!='\0';i++)
{
a[cha[i]-'A']++;
b[chb[i]-'A']++;
}
for(i=0;i<25;i++)
for(j=i+1;j<26;j++)
{
if(a[i]>a[j])
swap(&a[i],&a[j]);
if(b[i]>b[j])
swap(&b[i],&b[j]);
}
for(i=0;i<26;i++)
if(a[i]!=b[i])
{
cout << "NO" << endl;
return -1;
}
cout << "YES" << endl;
return 1;
}
我在做这个题的时候是抱着试一试的态度提交的,因为这种方法只是在确认同一个字母的个数是否相同,如果相同则加密后的信息和猜测的信息一致。那么就有一个问题,就以原题的输入来说:
JWPUDJSTVP
VICTORIOUS
这两个是匹配的,其中上面那段进行排序就是:
WJDUPSJPVT(即VICTORIOUS每个字母的ASCII码加1以后对应的字符)
那么如果我把第一个字符串中的J换成K,按照我们的理解这两个字符串就不应该是匹配的,可是由于仅仅是统计字母的个数,所以还是会输出YES。
但是如果按照我开始的想法,就是必须要严格匹配,那么就需要考虑Z往后就回到了字母的开头,那么实现的难度就增大了很多。我想了半天也不知道么样写这个程序,希望有人能给我一些好的建议。