アルゴリズム体操--- 5.9データベース(Uva1592)

:タイトル

データベース内のデータは、データの冗長性現象があるかどうかを検出します。すなわち、データの繰り返しの2つの以上の列があるかどうか

 

 

上記の図では、第二の列2行目と3行目を繰り返し、私たちは、データの冗長性が決定されます。彼は次の2つの表に分けることができますので、

 

 (A)サンプル入力

3  3 
どのように競争するためピーター@ neerc.ifmo.ru、ACM ICPC、ピーター・
ACM ICPC、マイケル、マイケル@ neerc.ifmo.ruの勝つためにどのように
ノートをからマイケル@ neerc.ifmo.ru ACM ICPCのチャンピオン、マイケル、
 2  3 
1 、ピーター、ピーター@ neerc.ifmo.ru
 2、マイケル、マイケル@ neerc.ifmo.ru

(B)サンプル出力

NO
 2  データ冗長性は3 @二列に発生していない
2  以上の二列の両方に表示される3 //冗長列
YES

2:コードの実装

#define _CRT_SECURE_NO_WARNINGS 
の#include <iostreamの> 
する#include < ストリング > 
の#include <sstream提供> 
の#include < 設定 > 
の#include <地図> 
の#include <ベクトル> 
の#include <アルゴリズム> 使用して名前空間STD。
ベクター < ストリング >分割(ソース、文字列パターン)
{ 
    ベクトル < ストリング > RES。
    INT SPOS = 0、EPOS、p_len = pattern.length() - 1

 
、s_len = source.length() - 1 ; 
    出典 + = パターン;
     CHAR COL = ' 1 ' ;
     ながら(SPOS <s_len &&(EPOS = source.find(パターン、SPOS))&& EPOS =!文字列:: NPOS)
    { 
        ストリームにstringstream、ストリーム
         << COL ++ ; //は、列番号の末尾に追加する理由は、データ複製の異なる列を防止することができる
        res.push_back((source.substr(SPOS、EPOS - SPOS))アペンド(stream.str()。 )); 
        SPOS = EPOS用+ 1 ; 
    } 
    戻りRES; 
} 

int型のmain()
{ 
    FILE* FP = freopenは(" data5_9.in "" R " 、STDIN)。
    freopenは(" data5_9.out "" W " 、STDOUT)。

    文字列のライン。
    int型の行、COL。

    一方、(!(CIN >>行)&&行= 0 
    { 
        // 获取行列数 
        CIN >> COL。

        ベクトル < 文字列 > str_vec。
        セット < 文字列 > str_set。
        マップ < 文字列> Str_map; 
        ベクター < INT > RES;     // 2つの行を保存し、一つは繰り返し

        のためにINT R&LT = 1 ; R&LT <=行R&LT ++ 
        { 
            GETCHAR(); のgetline(CIN、ライン);    
             //キーが使用
             
            str_vec =スプリット(行、" ");     // ないスプリット列パーティション関数ので、SUBSTRを見つけて使用する分割            
            ベクトル < ストリング > :: = str_vec.begin ITERイテレータ();     // 反復が挿入INT C = 1 ;
             のため

            (;!= Str_vec.end ITER(); ITER ++ 
            { 
                IF(str_set.count(*!ITER))
                { 
                    str_set.insert( * ITER); 
                    str_map [ * ITER] = R&LT * 10 + C ++ ; 
                } 
                他の    // 同じ列を繰り返し現れる
                {
                     INT R_r =(str_map [* ITER] / 10)* 10 + R&LT; 3 //行が23繰り返される表し
                    res.push_back(R_r * 10 + C ++); //重複ランクを追加RESをマッピング
                 } 
            } 
        } 

        IF(res.empty())     // 結果を出力
            裁判所未満<< " YES " << てendl;
        他の
        { 
            裁判所未満 << " NO " << てendl;
            INT r_r = res.front()。
            COUT << r_r / 100 << '  ' << r_r / 1010 << ENDL。    // 输出行
            のために(ベクトル< 整数 > ::それはres.beginを()=イテレータ; =それres.endを();!それ++ 
                はcout << *それ%10 < ;    // 输出列 
            はcout << てendl; 
        } 
    } 

    freopenは(" CON "" R " 、STDIN)。
    freopenは(" CON "" W " 、STDOUT)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/ssyfj/p/11520148.html