CSU 2127零的执行人
Description
身为全CSU(California State University)最厉害的侦探——福尔摩柯,你应邀出席了一年一度的侦探峰会。在峰会召开之际,组委会却收到了一封神秘的恐吓信,扬言要对会场实施爆炸袭击。
根据信封留下的作为证据的指纹,嫌犯被锁定为n个人,每个人的指纹可以被序列化为一个字符串s**(仅由英文小写字母组成)**。同时机敏的你发现这起事件与一个神秘的黑衣组织有关,而这个组织内的人物都有一个特点,那就是他们的指纹经过重新排列后能够形成一个回文串。
面对正在接近的阴谋,你需要尽快确认出哪些人是属于神秘的黑衣组织。
Input
多组数据,数据组数不超过10
每组数据首先一个n,代表n个人
接下来n行,每行一个字符串s,代表该人的指纹
n<=100
|s|<=100000
|s|代表字符串的长度
Output
对于每一个人,如果这个人属于黑衣组织,则输出“Dark”
否则输出“Elementary”
Sample Input
3
aba
ab
c
1
ccf
Sample Output
Dark
Elementary
Dark
Dark
题意
给出一个字符串,问只改变它字符的顺序能否构成回文串,如果能输出”Dark”,反之输出”Elementary”。
解题思路
回文串是左右对称的,根据这个性质直接判断每个字符个数的奇偶性即可。字符串长度为奇数时,字符个数里面只能有一个奇数,如果长度是偶数,那么个数里面不能有奇数。
由于开始的时候不知道字符的种类(那个括号里面的是后来加上去的,就直接上map了),924ms飘过~用数组做哈希表应该快一些。
代码
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<map>
using namespace std;
const int maxn = 1e5+5;
char str[maxn];
map<char,int> m;
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
{
m.clear();
scanf("%s",str);
int len=strlen(str),flag=0;
for(int i=0; i<len; i++)
m[str[i]]++;
if(len%2)
{
for(map<char,int>::iterator it=m.begin(); it!=m.end(); it++)
if(it->second%2) flag++;
if(flag>=2) puts("Elementary");
else puts("Dark");
}
else
{
for(map<char,int>::iterator it=m.begin(); it!=m.end(); it++)
if(it->second%2) flag++;
if(flag) puts("Elementary");
else puts("Dark");
}
}
}
}