PAT(Basic Level)Practice 1093文字列A+B

9719 ワード

1093文字列A+B(20分)
2つの文字列AとBを指定すると、本題ではA+B、すなわち2つの文字列の並列セットを出力する必要があります.Aを出力してからBを出力する必要がありますが、重複する文字は削除されなければなりません.
入力形式:
入力は2行にAとBがそれぞれ与えられ、いずれも長さが10 6を超えない可視ASCII文字(すなわち符号値32~126)とスペースからなる、リターン識別で終了する非空文字列である.
出力フォーマット:
1行に問題面要求のAとBの和を出力する.
サンプルを入力:
This is a sample test to show you_How it works
出力サンプル:
This ampletowyu_Hrk
簡単だと思っていたが、カードの時間の複雑さの穴に落ちた.弱いバージョンで何度も変更されたが、運行がタイムアウトになった.本当に南の壁をぶつけないと振り向かない.木の方法で、ぶつけられない.回り道をする.最も原始的な弱いバージョンは以下の通りだ.
#include <iostream>

#define N 1000000
#define M 2000000
using namespace std;
char a[M],b[N];

int main()
{
     
	int lena=0,lenb=0;
	int i,j;
	while((a[lena]=getchar())!='
'
) lena++; while((b[lenb]=getchar())!='
'
) { a[lena]=b[lenb]; lena++; lenb++; } a[lena]='\0'; for(i=0;a[i+1];i++) { for(j=i+1;a[j];j++) if(a[i]==a[j]) { int k=j; j=j-1;// while(a[k]) { a[k]=a[k+1]; k++; } } } cout<<a<<endl; return 0; }//

その後、元のバージョンを最適化し、N種類のバージョンを派生したが、最終的な大きなboss二重forサイクルは最適化されず、どのように簡素化しても無駄で、放出されなかった.正しいのはマークの方法を採用して、以前似たような問題はマーク法を使ったことがあって、今日そんなに苦労して意外にも思い出していないで、長い間コードをたたかないで、本当に能力が退化して、基礎知識も忘れた差は多くありません.正しいコードは次のとおりです.
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;

int main()
{
     
	string a,b;
	int k[127]={
     0};
	getline(cin,a);
	getline(cin,b);
	a=a+b;
	int i=0;
	while(a[i])
    {
     
        if(k[a[i]]==0)
        {
     
            cout<<a[i];
            k[a[i]]=1;
        }
        i++;
    }
	return 0;
}