問題Luogu P3370へのソリューション

いくつかのアプローチこの問題についての講演:

マッチング暴力

RT、暴力的な試合一緒にその文字列一文に等しい預金

時間複雑$ O(N ^ 2・メートル)$

データの範囲を見てください

$ N \ LE10 ^ 5メートル\ ^ 3 $ LE10

スポット爆発。もちろん、ポイントでの暴力があります

コード(20pts):

#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でそれを行うことができます

私たちはデジタル繰り返しはそれが何であるかであるかどうかを判断:考えることが第一?

コースブール値は、[1001]、それを使用しました

この質問は、文字列を行う方法を判断するように要求されます

文字列型の配列の添字負わ聖歌

マップ:主人公を作ります

我々は、アレイを定義するときに簡単に言えば、配列番号(例えばcharとして、BOOL、INT、長い長い、など)のタイプを決定することができ、そして下付き文字は、固定タイプ、すなわち整数であります

しかしマップが2種類の場合、すなわち決定することができ、私たちは「反配列」への基本的なデジタルタイプなどの添え字としても、文字列、することができます(抗配列が文字通りあるものを私に聞かないでください)

(すなわち、{興味深い} = 3 $ A $ 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法

聞いてはいけない理由は、最終的な、あなたは今まであなたがスタートBOSSを打つ作る見てきたどのゲーム?

C ++ STL法と同じ目的を持っています 抗右言いました

文字列の添字ができない場合ので、私たちはデジタルのものに文字列を入れます。

(~~半分振りかける花%%%%%%で~~ ORZ @ _明るい月)それのようなdalaoの何百もあるという問題への具体的な解決策を参照してください。

コード(単一のハッシュ、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