문제 Luogu P3370에 대한 솔루션

여러 방법이 문제에 대해 이야기 :

일치 폭력

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

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;
}

참고 : 계수가 너무 짧은 양력 생일 카드입니다 쓰기? 그런 넣어여자 친구 의 증가 뒤에 음력 생일 오리

추천

출처www.cnblogs.com/H2SO4/p/11616952.html