PAT(Basic Level)Practice 1093文字列A+B
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
簡単だと思っていたが、カードの時間の複雑さの穴に落ちた.弱いバージョンで何度も変更されたが、運行がタイムアウトになった.本当に南の壁をぶつけないと振り向かない.木の方法で、ぶつけられない.回り道をする.最も原始的な弱いバージョンは以下の通りだ.
その後、元のバージョンを最適化し、N種類のバージョンを派生したが、最終的な大きなboss二重forサイクルは最適化されず、どのように簡素化しても無駄で、放出されなかった.正しいのはマークの方法を採用して、以前似たような問題はマーク法を使ったことがあって、今日そんなに苦労して意外にも思い出していないで、長い間コードをたたかないで、本当に能力が退化して、基礎知識も忘れた差は多くありません.正しいコードは次のとおりです.
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;
}