羅区P5640] [CSGRound2夢想家の初期の心によって、

羅区P5640] [CSGRound2夢想家の初期の心によって、

羅区ポータル

トピックの背景

注:250msのを修正するには、この質問の時間、およびデータが大幅に強化されます。この質問はO2最適化に強制され、再テスト、自分自身を再送信してくださいません。

Yの学校の教師ので、テスト・ジェームズ完成カードに陰性であるが、すべての間違ったターゲットに決めた、非常に怒っているzhouwc、最後の3日間CSP中間試験に参加zhouwc必要、悪性腫瘍です。今retcarizyあまりにも貧しいzhouwc見て、問題を解決zhouwc助けたいが、あなたは訓練と準備の質問を置くように、彼自身が、GUGU区、あまりにも忙しかったです。

タイトル説明

あなたは長さの文字列を与えるnはS.

M \ルN-確保するための事業のm個ありますが、Mn-は

あなたは空にし始めて、文字列Tを持っていますか。

2つの動作モードがあります。

最初の操作:

文字列Tプラス文字の終わりに。

第2の動作:

文字列Tプラス文字の初めに。

[1、T.size]に出力いくつかのL \必要な各動作が完了した後L ∈を[1、T * S. I Z Eは* **]以下の基準を満たしています。

对于\ FORALL I \ [1、L]∀ I ∈[1、L ]有T_ {T.size-L + I} \ NE S_ {I} T T sののz eは - L + I = * S ** I *

ヒント:T I P:1つの開始から文字列のインデックス。T.size T * S I Z E * **は、長さTを示し、

入力形式

2つの正の整数の最初の行は、M、N- N-M

nは正の整数の第2行は、空白で区切られた、第I Iの整数S_I * S ** I *に示されます。

続いて、m個のm個の 2つの数の行は、CH選ぶO P TC Hを、OPT = 0 O P T = T 0は文字プラスCHの端示し C H、OPT。1 = O P T =を1に表しますTプラス文字ch * C ** hの先頭に*。

出力フォーマット

CO m個のm個の行は、各行が非負の整数を表し、m番目の操作を出力します。

サンプル入力と出力

入力#1コピー

出力#1コピー

説明/ヒント

注:このタイトルが使用するテストをバンドルあなたはを通してサブタスクをポイントすると、すべての後、唯一、あなたは、このサブタスクのスコアを取得することができます

\合計| | \ leq10 ^ 3 、でS_I \ [1、| \和|] N \ 3.3333 \回10 ^ 4、当量10 ^ 6、M \当量全てに対するデータのn ≤106、M ≤3.3333×104 、|Σ|≤103、* S ** I * ∈[1、|Σ|]。(\sumΣは、文字を表します)

subtask1(17%)(17%):M \当量333 、M ≤333

subtask2(33%)(33%):M \当量3333 、M ≤3333

subtask3(20%)(20%):| \合計| \leq2|Σ|≤2

subtask4(30%)(30%):いいえ特別な条件

サンプルは説明しました:

最初の操作の後、T = "1" T =" 1" 、

= Lの1 L = 1 T [1] = S [1] T [1] = S [1]、に答えは0であります

第2の操作後、T = "21は" T = "21は"

1 = LのL個の時間。1 =、T [2] = S [1] T [2] = S [1]

L = 2 L =時間2、T [1]!= S [1] T [1]!= S [1]、T [2]!= S [2] T [2]!= S [2]を答え2

第3の動作の後に、T = "213" T = "213"、

1 = LのL 1 =とき、T = S!。[3] [1] T =![3] S [1]。

= 2 LのL場合2 =、T [2] = S [1] T [2] = S [1]。

3 = LのL = 3、T [3] = S [3] T [3] = Sしたがって、答えは1である[3]

ソリューション:

診察室では私にビット無力をこの質問は緑道のタイトルが、はるかにせずに自分自身を形成するという考え方である見始めた、と冷たい汗を感じた...試合は頭部の前面にその気持ちを追加する、と述べていないと末尾の文字列。案の定、またはこんにゃくあまりにも料理。

より多くのこの時間は、より穏やかであることを。(ハッハッハ)一定期間の後、私はクールだけど、私は(いくつかの時間前に終了したばかり要約STLに当たっています、次のブログを参照してください:)

C ++ STLコンテナの完全なソリューション

これは、追加の要素がこのような容器デック頭と尾で実現することができることを見出しました。(グワハティハッハッハ)とSTLの両端キューは、いくつかの容器支持ランダムアクセスの一つであり、あまりにもうまく利用していないだけです!

暴力列挙試合の始まりを考えるアイデアの診察室。

私たちは、50ポイントを期待するが、唯一17ptsを得ることができます。

コード:

#include<cstdio>
#include<deque>
using namespace std;
const int maxn=1e6+10;
int n,m,tot,flag;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
    int x=0,f=1;
    char ch=nc();
    while(ch<48){if(ch=='-')f=-1;ch=nc();}
    while(ch>47)    x=(((x<<2)+x)<<1)+ch-48,ch=nc();
    return x*f;
}
int s[maxn];
deque<int> q;
int main()
{
    n=read(),m=read();
    for(int i=0;i<n;i++)
        s[i]=read();
    while(m--)
    {
        tot=0;
        int opt=read();
        int ch=read();
        if(!opt)
            q.push_back(ch);
        else
            q.push_front(ch);
        for(int i=0;i<q.size();i++)
        {
            flag=0;
            for(int j=0;j<=i;j++)
                if(q[q.size()-i+j-1]==s[j])
                {
                    flag=1;
                    break;
                }
            if(!flag)
                tot++;
        }
        printf("%d\n",tot);
    }
    return 0;
}

私はここでそれのペースを止めますか?インポッシブル!その後、私は約深く考え、そしてオリジナルの暴力に基づいていくつかの最適化を行いました。しかし、暴力の最適化は、多くの効果を果たしていませんでした。そして、それは思考の問題でなければなりません。だから私は少しを再考することにしました。私の考えはこれです:

時間はすべての試合暴力を許さない、とのマッチング処理を最適化することができないので、最終的な正のソリューションは、すべての試合になることはできません。何か神秘的な法律が存在する必要があります。

だから、僕はトイレの紙に絵を描きました...

(ここで私は、問題の解決策を書いている時点で当然の発想の分析に焦点を当て、口を挿入します。それはより多くの権利を行う方法について話よりもですが、またそれは、どのように正の解を考えてみたいという新たな問題であれば言うことはなく、いくつかの詳細が実際にありますそんなにより効果的な問題に端シミュレーション・ソリューションを見ながらトイレットペーパーの一部を取る正直に自分を許すことに、このようなこの種のものを描くトイレットペーパー、および衝動リーダーとして、理解しにくい経口。)

答えはオーバー転送することができる前に、各質問への答えが正当なものであるならば私たちは、それを発見しました。

王Qianmian要素が挿入されたときに特定の点は、古い回答の挿入前に列の数が影響を受けることはありません。再び、この新しいシリーズを、それをスキャンする必要があると列の数を指定しただけです\(S \)全範囲かどうか、そしてそれがある場合、それ手段が正当な答えを持っています。

前の要素に対する答えが戻って挿入したときと、それは昔の列の数に影響します。言い換えれば、我々は試合を必要とするフロント正当な答えが正当性を維持することができる場合

アイデアは右ですが、コードは書かない、テストの残りの2時間は、すべてこのアイデアで達成しようとしたが、失敗しています。

だから、最終的に17点。

私はなぜ理解し、問題と同様のソリューションを見て、アイデア。挿入された後方ので、あなたが以前のすべての法的な答えを一致させる必要がある場合。それでは、どのようにそれの前に正当であるかの答えを知っていますか?非常に単純な、そして開く\(ベクトルを\)何をすることができます保存してください。

このについて:

#include<cstdio>
#include<deque>
#include<vector>
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e6+10;
int n,m;
int s[maxn];
bool flag;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
    int x=0,f=1;
    char ch=nc();
    while(ch<48){if(ch=='-')f=-1;ch=nc();}
    while(ch>47)    x=(((x<<2)+x)<<1)+ch-48,ch=nc();
    return x*f;
}
deque<int> q;
vector<int> vec;
vector<int>::iterator it;
int main()
{
    n=read();m=read();
    for(int i=0;i<n;i++)
        s[i]=read();
    while(m--)
    {
        int opt=read();
        int x=read();
        if(opt)
        {
            q.push_front(x);
            flag=0;
            for(int i=0;i<q.size();i++)
                if(q[i]==s[i])
                {
                    flag=1;
                    break;
                }
            if(!flag)
                vec.push_back(q.size());
        }
        else
        {
            q.push_back(x);
            it=vec.begin();
            while(it!=vec.end())
            {
                (*it)++;
                if(s[*it-1]==x)
                    vec.erase(it);
                else
                    ++it;
            }
            if(s[0]!=x)
                vec.push_back(1);
        }
        printf("%d\n",vec.size());
    }
    return 0;
}

もともとそれほど開いて開かれた\(O2 \)の前に。しかし、問題の人々と変更されたデータ、時間の圧力が、このアイデアになるので、\(70 \)サブコード。

その後、我々は正の解決策を見て:

それぞれの文字と各座席は1位を記録している各文字の独立しています。

(F [I] = 0 \ \ \ \、または\ \ \、1 \)は長さを表し(I \)\サフィックス缶、1は何を表し、0を表します。

考えてみましょう\(F \)のみ\(0 \)\(1 \)は、使用することができます(ビットセット\)\開くために、各文字のために最適化された\(ビットセット\)レコードを文字ではありません。

文字の最後に追加すると、実行した後に残った\(あるいは\)の操作を。

プラスの直接の先頭に文字\(あるいは\) 1つの長さに沿って左に表示される文字の状態。

答えは、の範囲にある\(0 \)番号。

そして、両端キューの伝説は、ビットセットになり......

おすすめ

転載: www.cnblogs.com/fusiwei/p/11837509.html