여러 방법이 문제에 대해 이야기 :
일치 폭력
RT, 폭력 일치 함께 해당 문자열 한 문장에 해당하는 보증금
시간 복잡도 $의 O (N · m ^ 2) $
데이터의 범위 봐
N $ \ LE10 ^ 5m \ ^ 3 $ LE10
현물 폭발.물론 점에서 폭력이
코드 (20 부) :
#include <bits/stdc++.h>
using namespace std;
char c[100001][1001];
bool pd(int x, int y)
{
int l1 = strlen(c[x]), l2 = strlen(c[y]);
if(l1 != l2) return 0;
for(int i = 0; i < l1; i++)
{
if(c[x][i] != c[y][i]) return 0;
}
return 1;
}
int main()
{
int n;
cin >> n;
int ans = n;
for(int i = 1; i <= n; i++)
{
cin >> c[i];
for(int j = 1; j < i; j++)
{
if(pd(i, j)) ans--;
}
}
cout << ans;
return 0;
}
Haopiaoliangya
왜 WA는 묻지 말고, 내가 이전을 생각
문자열 방법
비교 정상적인 방법을
아이디어는 운영자를 운반하는 문자열을 정렬 사전 식에 대한 모든 문자열을 유지하는 것입니다 (보다 이상 이하)
그런 다음 사전 식 순서는 반복 여부가 결정된다 팔로우
잘 시간 복잡도
$ O (N · logn) $ 수행 할 수 있습니다카드라이브
코드 (100pts) :
#include <bits/stdc++.h>
using namespace std;
string s[10001];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> s[i];
}
sort(s + 1, s + n + 1);//因为string自带大于和小于所以不用cmp
int ans = n;
for(int i = 1; i < n; i++)
{
if(s[i] == s[i + 1]) ans--;
//若两个字符串相同则他们的字典序一定是相邻的
}
cout << ans;
return 0;
}
C ++ STL 법
물론 우리는 ~ 모든 것을 STL와 함께 할 수 있습니다
먼저 생각하는 우리가 판단 디지털 반복은 그것이 무엇인지?
사용 과정 BOOL [1001]를
이 질문은 문자열을 수행하는 방법을 판단하도록 요청
문자열 타입 배열 첨자 입힌 노래
주인공을 확인하십시오 :지도
우리는 단순히 배열을 정의 할 때, 배열 번호 (등과 긴 긴 CHAR, BOOL, INT와 같은)의 종류를 결정할 수 있고, 넣어 첨자는 정수 즉 고정식 인
그러나 맵이 경우 두 가지 유형을 결정할 수 있습니다, 그건 "카운터 배열"에 대한 기본적인 디지털 형식으로 첨자로 우리가 할 수있는, 심지어 문자열, 말을하는 것입니다(묻지 않음 방지 배열은 문자 그대로 어떤)
(즉, $의 A_를 작성하지 않는 {재미있는} = 3 $ A)
그때위 문장의 상한이 문제는 그것을 할 수 있습니다!
시간의 복잡성 알을 어쨌든, 그것은을지도하고 싶어
코드 (100pts) :
#include <bits/stdc++.h>
using namespace std;
map < string , bool > m;//定义一个以string类型为下标的bool数组
string s;
int main()
{
int n;
cin >> n;
int ans = n;
for(int i = 1; i <= n; i++)
{
cin >> s;
if(m[s]) ans--;
else m[s] = 1;
}
cout << ans;
return 0;
}
폭력보다 짧은
HASH 법
묻지 마세요 왜 마지막, 당신이 이제까지 당신이 시작이 보스를 치다 본 적이있는 게임?
는 C ++의 STL 법률과 동일한 목적을 가지고 고 말했다 안티 오른쪽
때 문자열 첨자 할 수 없기 때문에, 우리는 디지털 일에 문자열을 넣어.
좋아 dalao 수백 (~ orz @ _ %%%%%% 반 뿌려 꽃 ~ ~ 밝은 달)이 있다는 것을 문제로 특정 솔루션을 참조하십시오
코드 (단일 해시, 100pts) :
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull base = 131;
ull a[100001];
char c[10001];
ull hashe(char s[])
{
int l = strlen(s);
ull ans = 0;
for(int i = 0; i < l; i++)
{
ans = (ans * base + (ull)(s[i])) % 200408020617;
}
return ans;
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> c;
a[i] = hashe(c);
}
sort(a + 1, a + n + 1);
ull ans = 1;
for(int i = 1; i < n; i++)
{
if(a[i] != a[i + 1]) ans++;
}
cout << ans;
return 0;
}
참고 : 계수가 너무 짧은 양력 생일 카드입니다 쓰기? 그런 넣어여자 친구 의 증가 뒤에 음력 생일 오리