Add Me!Close Menu Navigation

ニートは職業ではない、生き方である

Add Me!Open Categories Menu

ソニーのソフトウェアスペシャリスト認定コンテスト『暗号検索の高速化』(2)

2/8追記:ライセンスについて

※回答はオープンソースソフトウェアとして公開してください。
その際、そのソフトウェアをOSDに準拠したライセンス(GPLライセンスやBSDライセンスなど)であることを明示して公開してください。

とあるので、ここのコードは修正BSDライセンスとして扱って下さい。普段は常識的な範囲でご自由にライセンスにしておくのだけど、OSSの世界ではそれは困るらしい。

ソニーのソフトウェアスペシャリスト認定コンテスト『暗号検索の高速化』(2)

前回のエントリで勘違いした実装をしてやり直し。一部分だけ直したけど、これは方針が悪いのでとても遅い。

前回のDFSを使い回しているのだけど、30万文字あって等確率に出るとすると1文字あたり1万回以上は出てくる。その全ての文字に対して2文字目は総当たりで探索しているので、10000 x 10000 = 1億くらいの初期ノードでやっていて正気の沙汰とは言えない。小さいのを求めるのが目標だからこれ以上いいスコアが出る見込みがない場合には探索を打ち切ることにしているけど、それでも手元のPCで20秒くらいかかるため、要改善。

#include < stdio.h>

#include < iostream>
#include < string>
#include < set>
#include < map>
#include < algorithm>
#include < stack>
#include < vector>
using namespace std;

struct node
{
    int address;
    int depth;
    int skip;
};

int main( int c, char *v[] )
{
    if( c != 2 )
    {
        fprintf( stderr, "%s keywordn",v[0] );
        return EXIT_FAILURE;
    }
        
    string keyword = v[1];
    string reverse = keyword;
    std::reverse( reverse.begin(), reverse.end() );
    
    set<char> k;
    for( int i = 0; i < keyword.length(); i++ )
        k.insert(keyword[i]);
    
    // アドレス、文字
    map<int, char> m;
    
    int loc = 0;
    while(!feof(stdin))
    {
        char ch = fgetc(stdin);
        if( k.count(ch) != 0 )
            m.insert(make_pair<int, char>( loc, ch ));            
        loc++;
    }

    stack<node> s;

    for( map<int, char>::iterator it = m.begin(); it != m.end(); it++ )
    {
        node n;
        if( it->second == reverse[0] )
        {
            n.address = it->first;
            n.depth = 1;
            n.skip = 0;
            s.push(n);
        }
    }
    
    int min = loc;
    vector< pair<int, int> > result;
    while( !s.empty() )
    {
        node n;
        n = s.top();
        s.pop();
        
        // 脱出条件をここに書く
        if( reverse.length() == n.depth )
        {
            map<int, char>::iterator it = m.find( n.address );
            if( m.end() != it )
            {
                min = std::min( min, abs(n.skip) );
                result.push_back(make_pair<int, int>(abs(n.skip), n.address));
            }
            continue;
        }
        
        // ここでノードの枝を全部辿るループを書く
        if( n.depth == 1 || n.skip == 0 )
        {
            // 初回は全部見ておく
            for( map<int, char>::iterator it = m.begin(); it != m.end(); it++ )
            {
                if( it->second == reverse[n.depth] )
                {
                    node next;
                    next.address = it->first;
                    next.depth = n.depth + 1;
                    next.skip = next.address - n.address;
                    s.push(next);
                }
            }
        }
        else
        {
            // 枝狩り、最良になる見込みのないのは要らない
            if( abs(n.skip) > min )
                continue;
            
            // 二回目以降はskipだけ離れたところしか見ない
            map<int, char>::iterator it = m.find( n.address + n.skip );
            if( m.end() != it && it->second == reverse[n.depth] )
            {
                node next;
                next.address = it->first;
                next.depth = n.depth + 1;
                next.skip = next.address - n.address;
                s.push(next);
            }
        }        
    }
    
    sort( result.begin(), result.end() );
    for( int i = 0; i < result.size(); i++ )
        fprintf( stdout, "%d, %dn", result[i].first, result[i].second );
    
    return 0;
}

実行結果

こっちは枝狩りをしている方。

1, 118590
2, 149499
2, 234392
2, 286130
3, 289966
3, 298337
213, 298248
1928, 293465
4356, 286390
14960, 254591
27030, 218446

枝狩りをしないとなんと65,000行以上の出力になる。というか解がこんなに多いとは予想以上である。

恥さらしなコードを晒したので後で改善したいと思う。けど、2/10に帰国を控えて忙しいのでどうなるかわからない。

なぜ、週4時間働くだけでお金持ちになれるのか?

  • 著者/訳者:ティモシー フェリス
  • 出版社:青志社( 2007-09-21 )
  • 単行本:255 ページ
  • ISBN-10 : 490385311X
  • ISBN-13 : 9784903853116
  • 定価:¥ 1,470

「週4時間」だけ働く。

  • 著者/訳者:ティモシー・フェリス
  • 出版社:青志社( 2011-02-03 )
  • 単行本:640 ページ
  • ISBN-10 : 4905042097
  • ISBN-13 : 9784905042099
  • 定価:¥ 1,995

君が衛生兵で歩兵が俺で (スマッシュ文庫)

  • 著者/訳者:篠山 半太
  • 出版社:PHP研究所( 2012-06-16 )
  • 文庫:340 ページ
  • ISBN-10 : 4569678467
  • ISBN-13 : 9784569678467
  • 定価:¥ 720
Posted By onaneetX.Q

Leave a Reply




最近の投稿

最近のコメント

アーカイブ

カテゴリー

メタ情報

Twitter: honour_neat

  • AT&Tは腐っているから別のSIMカードを買った。25ドル損をした。それにしても4Gと出ているのは新鮮である。 http://t.co/BAor2ILR ReplyRetweetFavorite
  • アメリカ人のホストはテレビをつけたまま仕事に出かけてしまった。全体的に節電という意識がないのがアメリカ人だと思うが偏見だろうか。 ReplyRetweetFavorite
  • GP038: The activation has taken longer than normal. Please try again later. 色々と問題の多いAT&Tのサイトだな。 ReplyRetweetFavorite
  • We are currently experiencing a temporary system error that prevents us from retrieving your account information. 携帯の登録ができない・・・ ReplyRetweetFavorite
  • ホストのところに到着した。プエルトリコの人だった。ネイティブの英語はキツいけど彼の英語はむしろ自分には僥倖である。彼は近くのドアマンをやっていて、仕事は4時から深夜1時だそうだ。部屋はなかなか素敵なところだが、機械音痴っぽくてコンピュータ関係は手間取りそう。とりあえず無線LAN。 ReplyRetweetFavorite
  • よく見たらCantoneseと書いてある。広東語か。 ReplyRetweetFavorite
  • 中華料理屋のメニュー。中国語表記あり。アメリカの中国語は繁体字が多い。台湾人が多いというより文革前に移住した人が多いのだろうか。でも拼音も少し違うな。香港系なのかな? http://t.co/eGneKUIV ReplyRetweetFavorite
  • アメリカはチップ文化なのは知識としては知っている。で、4年振りくらいのアメリカだけどチップを渡すと躊躇なく受け取るところが新鮮である。トルコでもホテルでチップを渡したことはあるが、一瞬の戸惑いみたいなのがあってそれから受け取っていた。 ReplyRetweetFavorite
  • PPTPで日本にあるルータにVPNセッションを張って、FTPで録画したファイルをダウンロードしている。ホテルのロビーのWiFiだけど150KB/sくらい出ているのでまあまあ満足。台湾の方が早いけど距離的な問題もあるしまあ仕方ないかな。 ReplyRetweetFavorite
  • RT : 管直人前首相がこのあと16:00〜高知市内で講演をします。もちろん参加してきます!テーマは「若者、市民の政治参加とは」です。 ReplyRetweetFavorite
  • 慌ててチェックアウトしたがバスまで30分あるとはね。もっとゆっくりすればよかった。 ReplyRetweetFavorite
  • 今年はクレジットカードのコンシェルジェを使い倒してみることにした。で、シャトルバス(http://t.co/K5Dasvzk)の手配を頼もうと思ったけど、upper upper eastまでは結構高そうだから大人しくA線でちんたらいくことにする。AT&Tストアが近くにあるし。 ReplyRetweetFavorite
  • アメリカのいいところは人種が多いところだ。日本や中国語圏ではどれだけ中国語が上手くなっても外国人扱いである(結婚して台湾籍になっているアメリカ人はずっと美國人と言われる)が、アメリカは英語ができればおそらくアメリカ人と同等に見なしてくれる。これはフランスもそうだったと思う。 ReplyRetweetFavorite
  • 中国語は英語よりも下手と言っても喋った回数は中国語の方が多いため、話していて気楽なのは中国語である。アメリカに来ると別世界に来たと神経張り詰めているけど、台湾に行くのは国内旅行のように気軽に行ける。英語もここまでいければいいのだけど。大人になってから英語はどこまで身に付くかな。 ReplyRetweetFavorite
  • ニューヨークのホテルにいても外から中国語が聞こえる。しごく簡単な会話だけど内容が分かるのは嬉しい。以前、ほぼ海外童貞でニューヨークに来たときは日本人を見かけると「おお、日本語だ」と思ったけどそういう言語が1つ増えたことになる。もっとも中国語能力はまだまだ足りない。英語より下手。 ReplyRetweetFavorite
  • ホテルのフロントにイスラエルから来たという女性がいる。夫はドワンゴだとか何とか。肌が浅黒くてあまりイスラエルのイメージではないけど、いろいろな人がいるのだなと興味深い。 ReplyRetweetFavorite
  • ホテルの予約は何故か消えていたけど、クレカ会社に電話をしたら掛け合ってくれたらしく部屋には入れた。なんだ、部屋あるじゃないか。同じく締め出されたアジア系っぽい顔の人も一緒に別の部屋に案内された(彼は英語が流暢なようだけど最初は断られていた)。 ReplyRetweetFavorite
  • .@ykonda たぶんみんなで一緒に不幸になろうという考え方が日本人に広くあるからですね。一人だけ抜け駆けして幸せになるやつは許せないというわけ。気に入らないから寄付しないだけでは彼女の元に金が集まるのは阻止できないからできるだけ罵詈雑言を並べるのかと。社畜と同じです。 ReplyRetweetFavorite
  • ニューヨークに着いた。シャトルバスを呼ぶ電話は蚊の鳴くような声しか聞こえず日本語でも意思疎通に困難なレベル。やっと用件を伝えてバスを待つこと1時間。ターミナルには同じホテルの客が溢れて過積載状態で連れて行かれた。ホテルに行ったら予約ないぞってことでクレカ会社に掛け合って云々。 ReplyRetweetFavorite
  • 【画像あり】アメリカ人のゲーム部屋が凄すぎると話題に http://t.co/FeXtv52Q ReplyRetweetFavorite

RSS Tumblr

  • bbsmaster: 安藤遥 2012年4月27日
    bbsmaster: 安藤遥 […]
  • NVR500 PPTP設定 2012年4月8日
    PPTPでVPNを張ってDNSの通知をする。とりあえず ip route default gateway pp 1 pp select 1 pp always-on on pp enable 1 pp select anonymous pp bind tunnel1-tunnel2 pp auth username ID pass pp auth username ID2 PASS2 ppp ipcp ipaddress on ppp ipcp msext on pp enable anonymous tunnel select 1 tunnel encapsulation pptp pptp tunnel disconnect time off tunnel enable 1 tunnel select 2 […]
  • " 285 : 216  : 2011/02/17(木) 22:55:06 ID:tvQNovvz [7/7回発言] ..." 2012年4月6日
    “ 285 : 216  : 2011/02/17(木) 22:55:06 ID:tvQNovvz [7/7回発言] 相談に乗ってくれた方々本当にありがとうございます。 結論から言いますとリモートデスクトップで接続成功しました。 全部自分がアホなだけでした。 同じような人がいないとは思いますが経緯を報告します。 自分の環境はWin7x64だった為、Boncaslinkの64bit版を入れていたのが 原因でした。 最初TVTestの64bit版で再設定を行って設定したところ、Bancasproxyが 赤色に変わり使用中のアプリのリストにTVTestが表示されました。 もしやと思い、32bit版で全てのアプリ(TVTest、関係とBonCaslink)を統一 して、設定したところ正常に作動しました。 テストとして他 […]
  • 大学生に勉強させる?大学の時間とは何か 2012年3月20日
    大学生に勉強させる?大学の時間とは何か: 「勉強をしない」学生に勉強をさせるべく、国が重い腰を上げたのだという。繰り返すが、けっこうなことだ。ならば、国には、「シュウカツ」という名目のもとに大学生の時間を大幅に奪う企業に対して根本的な対策も取ってもらいたい。 人々は故意に目をそむけている。いわゆる有力大学の学生よりも、そうでない大学の学生のほうが、「三流大学」の学生のほうが、「シュウカツ」においてより多くの時間を取られ、より多くのエネルギーを費やしながら、より多く落とされ続け、より多く踏みつけられ続けているという事実に。 日本の問題の何割かは《醜活》に起因あるいは関係しているとすら思う。《醜活》があるから採用の混乱が起こるし、それゆえ企業の活力が落ちるし、その結果納税額は下がるわ、企業の業績が悪いから不景気にな […]
  • ウホッ!良い情報!! 2012年3月20日
    ウホッ!良い情報!!: 米・英・加についてですが、(これは個人的なバイアスがかかりますが 汗)その3カ国のなかでもしbeyond_NEETさんの目的がその国への移民・永住ということでしたら、一番達成しやすいのは加であると思います。 移民法が整備されており、公立(もしくは政府公認)の大学・専門学校で2年以上の課程を修了した留学生は、就職先が決まっていようと無かろうと最長で3年の就労ビザを取得でき、カナダ国内で自由に働けます。(公務員や役所仕事はさすがにカナダ永住者か国籍保持者を優先するとは思いますが) その後、カナダ政府が指定する職種内容で最低一年間就労すると永住権申請の資格が与えられます。 他にも有益な情報多数。 […]
  • 雇用推計:若者ミスマッチ鮮明 「即戦力」重視、構造的に 2012年3月20日
    雇用推計:若者ミスマッチ鮮明 「即戦力」重視、構造的に: 若者が即戦力なわけないじゃん。若者で即戦力になり得るとすれば、若さを活用するしかない。美人を雇用して営業させるとか(枕営業)、そこまでいかないにせよどぶ板営業に耐えられるようなノリのいいリア充でも雇うしかない。若さは魅力だから、くたびれたおっさんよりもかわいい子から買いたいと考える可能性がある。 一流企業の営業は比較的楽である。なぜならほっといても商品やサービスは売れるからだ。だから、二流以下の会社に入ると営業力で会社を維持しているようなところが結構ある。インターンした某ソフト会社も外に出て率直に意見を求めたら、社員が言うほどその会社の製品は優れていないことがわかった。つまり、あの会社の業績は技術力ではなく営業力で成り立っていた。 ほとんどの会社は製品や […]
  • 羽田→台北松山→台北桃園→ニューヨークのOPEN航空券。 2012年3月19日
    羽田→台北松山→台北桃園→ニューヨークのOPEN航空券。 […]
  • " 多分こういう食事がセブの一般の人の食事なんだと思う。味はまあまあ美味しい。食堂自体は不衛生ってわけではないけれど、建物はボロくてそんなに綺麗じゃないし、椅子や机も安っぽいプラスチック製でガタガタする。..." 2012年3月19日
    “ 多分こういう食事がセブの一般の人の食事なんだと思う。味はまあまあ美味しい。食堂自体は不衛生ってわけではないけれど、建物はボロくてそんなに綺麗じゃないし、椅子や机も安っぽいプラスチック製でガタガタする。でもそういうアジアの安食堂の雰囲気が僕は好きなので落ち着く。  対比して思うのは日本のことだ。日本でお金のあんまりない人が食べる安食堂といえば、松屋とか吉野家とかの牛丼屋チェーンが一般的になっていて、280円ぐらいの安い値段でそこそこの味のものが腹いっぱい食べられるのだけど、あの店舗の小綺麗さはなんなんだろう。貧乏人向けなのにピカピカでシステマチックにできている。よく考えてみると、日本では小汚いけれどその代わりに安く食べられる店というのがあんまりない(全くなくはないけどチェーン店の牛丼のほうが安い)。” - 確 […]
  • "突然ですが、問題です。 自己紹介の言葉として、適切なのはどちらでしょう? ○○大学経済学部に在籍(ア:させていただいております/イ:しております)。 上記の問題は、数日前の読売新聞の朝刊に掲載され..." 2012年3月19日
    “突然ですが、問題です。 自己紹介の言葉として、適切なのはどちらでしょう? ○○大学経済学部に在籍(ア:させていただいております/イ:しております)。 上記の問題は、数日前の読売新聞の朝刊に掲載されていた、就職活動をしている学生向けの「日本語教室」という記事より(日本語検定委員会協力)抜粋しました。敬語として正しいのは、ア、イのどちらでしょうか? 正解は以下から。 正解は「イ:しております」。この記事によると、「させていただく」という言葉を使うためには、以下の3点を満たしている必要があるそうです。 自分のことであること 相手の許可を得て行われていること それに対して感謝するという事実や気持ちがあること” - 敬語は誰に対して使っているかを意識すればOKでそう難しいものではない。「○○大学経済学部に在籍させていた […]
  • 世界の生活費 2012年3月19日
    元記事は比較的「だそうです」が多くてあまり役には立たない印象。 とりあえず海外の生活費について。台湾は家賃数千元からある。食費は一食60元〜100元くらい。1台湾元=2.6円くらいだった。贅沢をすれば青天井だけど。台湾の新卒者の給料が月給で2万元〜6万元くらいだから月2万元あれば生きていけるのだろう。自分の感覚だと2万元はちょっときつい。家賃6000元くらいの部屋で食費が1万元くらいで少し余裕がある程度か。携帯代とか交通費も必要なのでカツカツである。台湾の安い部屋は台所がついていないところが多く自炊は難しい。 中国は一食10元前後で拉面とか牛肉烩饭がある。ちょっと洒落たところだと30元くらいか。南京のアパートだと家賃数百元くらい。たしか上海の平均賃金が台北を超えたそうだ。たぶん今だと平均賃金が日本円で7万円くら […]

Facebook