POJ 2945 Find the Clones
Doubleville, a small town in Texas, was attacked by the aliens. They have abducted some of the residents and taken them to the a spaceship orbiting around earth. After some (quite unpleasant) human experiments, the aliens cloned the victims, and released multiple copies of them back in Doubleville. So now it might happen that there are 6 identical person named Hugh F. Bumblebee: the original person and its 5 copies. The Federal Bureau of Unauthorized Cloning (FBUC) charged you with the task of determining how many copies were made from each person. To help you in your task, FBUC have collected a DNA sample from each person. All copies of the same person have the same DNA sequence, and different people have different sequences (we know that there are no identical twins in the town, this is not an issue).
상기 설명 정보에 따라 본 문제를 추상적으로 다음과 같이 할 수 있다. 문자열을 주면 수량은 n이고 모든 문자열의 길이는 m이며 출력은 i(1<=i<=n)회의 문자열의 개수를 나타낸다.
문제 해결 방법:
최근에 사전나무를 공부하고 있는데 처음에는 이 문제를 보고도 사전나무로 하려고 했어요.생각해 보니 사실은 더 간단한 맵으로 실현할 수 있다.맵
실현 시 주의해야 할 점:
1. 맵을 정의할 때 키 형식이char*이기 때문에 사용자 정의 비교 함수가 필요합니다.
2. 매번 new의 새로운 문자열을 피하기 위해 문자 그룹을 정의합니다. new가 필요한 곳은 직접 그룹에서 가져옵니다.
Memory: 1184K Time: 2938MS
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
struct cmp //
{
bool operator()(const char *s1, const char *s2) const
{
return strcmp(s1, s2) < 0;
}
};
int main()
{
char *dna;
char dnas[20000][21]; // , new
int num[20000];
map<char*, int, cmp> mp;
int i, j, m, n;
while(scanf("%d%d", &n, &m))
{
if(n == 0 && m == 0)
break;
j = 0;
mp.clear();
for(i = 0; i < n; i++)
{
dna = dnas[j++]; //
scanf("%s", dna);
mp[dna]++;
}
memset(num, 0, sizeof(num));
map<char*, int, cmp>::iterator iter = mp.begin();
while(iter != mp.end())
{
num[iter->second - 1]++;
iter++;
}
for(i = 0; i < n; i++)
{
printf("%d
", num[i]);
}
}
return 0;
}
맵을 이용하여 실현하면 프로그램의 실행 효율이 비교적 낮다.시간이 있으면 다시 Trie 방법으로 실현하고 양자의 효율을 비교한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 집합 Iterator 교체의 실현 방법이것은 각종 용기 안의 모든 대상을 표준화하는 방법류이고 이것은 매우 전형적인 디자인 모델이다.Iterator 모드는 집합 클래스를 훑어보는 데 사용되는 표준 접근 방법입니다.그것은 접근 논리를 서로 다른 유형의 집...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.