您的位置:首页 > 其它

UVA 156 Ananagrams

2015-06-18 20:45 417 查看
题目链接:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19105
题意:

给一个字典,按字典序(大写无条件在小写前面)输出不能通过排序来在字典中找到另一个与之无大小写差别的词的词(语文好没法)

思路:

纯模拟,因为字符数组不可排序所以存储每一个词的每种字母出现次数。

源码:

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <iostream>

#include <algorithm>

#include <queue>

using namespace std;

#define gmin(a,b) a<b?a:b

char down(char a)

{

if(a>='A' && a<='Z')

return a + 'a' - 'A';

return a;

}

bool up(char c)

{

if(c >='A' && c<='Z')

return true;

return false;

}

struct D

{

char data[20+5];

}dd[1000+5];

bool cmp(D a,D b)

{

int l1 = strlen(a.data);

int l2 = strlen(b.data);

for(int i=0; i<gmin(l1,l2); i++){

if(a.data[i] != b.data[i]){

if(up(a.data[i]) * up(b.data[i]))

return a.data[i] < b.data[i];

else

return a.data[i] < b.data[i];

}

}

return l1<l2;

}

const int MAXN = 1000+5;

char dic[MAXN][20+5];

int alp[MAXN][30];

int vis[MAXN];

int main()

{

// printf("A = %d,a = %d\n",'A','a');

int cnt = 0;

char tt[20+5];

while(scanf("%s",tt) != EOF && strcmp(tt,"#")){

strcpy(dic[cnt++], tt);

}

memset(vis,0,sizeof(vis));

memset(alp,0,sizeof(alp));

for(int i=0; i<cnt; i++){

for(int j=0; j<strlen(dic[i]); j++){

alp[i][down(dic[i][j]) - 'a']++;

}

}

for(int i=0; i<cnt; i++){

for(int j=i+1; j<cnt; j++){

int ff = 1;

for(int k=0; k<26; k++){

if(alp[i][k] != alp[j][k]){

ff = 0;

break;

}

}

if(ff)

vis[i] = vis[j] = 1;

}

}

int mm = 0;

for(int i=0; i<cnt; i++)

if(vis[i] == 0)

strcpy(dd[mm++].data,dic[i]);

sort(dd,dd+mm,cmp);

for(int i=0; i<mm; i++)

printf("%s\n",dd[i].data);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: