C++——文字列処理問題——万能リモコン
6499 ワード
ユニバーサルリモコン
タイトルの説明
Z企業には様々なロボットがあります.すべてのロボットを制御するために、オペレータトムは「万能リモコン」を作った.リモコンにロボットのIPアドレスを入力するだけで、このロボットをリモコンすることができます.しかし、ロボットが多すぎて、IPv 4プロトコルを使用してもロボットごとに一意にマークできません.トムはIpv 6プロトコルが無限近くのアドレスを持っていると聞いて、IPv 6プロトコルでロボットにIPアドレスを設定しようとした.
ただし、完全なIPv 6アドレスは長く(39文字)、手作業で入力するのに時間がかかるため、IPv 6には簡略化されたメカニズムがあります.
IPv 6のアドレス定義は以下の通りである:IPv 6のアドレスは128ビットで、16ビットを1パケットとし、各16ビットパケットは4つの16進数とし、中間はコロンで分割され、コロン分16進数フォーマットと呼ばれる.例えば、21 DA:00 D 3:0000:2 F 3 B:02 AA:00 FF:FE 28:9 C 5 Aは完全なIPv 6アドレスである.
IPv 6アドレスの各16ビットパケットの先頭ゼロビットは簡略化された表現として除去することができるが、各パケットは少なくとも1ビットの数字を保持しなければならない.上記の例のアドレスのように、プリアンブルゼロビットを除去した後、21 DA:D 3:0:2 F 3 B:2 AA:FF:FE 28:9 C 5 Aと書くことができる
一部のアドレスには長いゼロシーケンスが含まれている場合がありますが、表現をさらに簡略化するために、隣接するパケットの連続ゼロビットを、2つのコロン":"で表すこともできます.「::」記号は1つのアドレスに1回しか現れず、アドレスの前部と末部に隣接する連続ゼロビットを圧縮するためにも使用できます.注意:(個別の0パケットでは「::」は省略できません.
例えば、アドレス:サンプル1:1080:0:0:0:0:8:800:200 C:417 Aは圧縮形式1080:8:800:200 C:417 Aサンプル2:0:0:0:0:0:0:0:0:0:0:0:0:1は圧縮形式:::1サンプル3:0:0:0:0:0:0:0:0:0:0:0:0は圧縮形式:::
今、トムはあなたにIPv 6アドレスをあげました.プログラムを書いて、それらを完全なアドレスに変換してください.
入力フォーマット
第1の動作は、N個のIPアドレスがあることを示す正の整数Nである.次にn行があり、各行に空でない文字列があり、アドレスを表します.入力には、数字、大文字、コロン(:)、改行のみが含まれ、行ごとに39文字を超えないように入力します.
出力フォーマット
合計N行を出力し、行ごとに文字列を1つずつ出力します.入力された文字列ごとに、IPv 6規格を満たしている場合は、対応する完全なIPv 6アドレスが出力され、そうでない場合は「INVALID」が出力されます.
サンプルデータ1
[コピー]を入力
4
1080::8:800:200C:417A
::1
::
1234567890ABCDEF
しゅつりょく
1080:0000:0000:0000:0008:0800:200C:417A
0000:0000:0000:0000:0000:0000:0000:0001
0000:0000:0000:0000:0000:0000:0000:0000
INVALID
コメント
【データ範囲】
100%のデータに対して、保証:1≦N≦35
個人情報:
この問題は比較的に穴があいていて、多くの情況が討論する必要があって、N回試してやっとAC..............................
そして最後にcompile errorの原因を発見しました.
これを打つのを忘れた・・・・
正解は以下の通りです.
バージョン1(オリジナル):
バージョン2(teacherの問題解)(
バージョン3(ある同級生の、あまりにも個性的だから..):
タイトルの説明
Z企業には様々なロボットがあります.すべてのロボットを制御するために、オペレータトムは「万能リモコン」を作った.リモコンにロボットのIPアドレスを入力するだけで、このロボットをリモコンすることができます.しかし、ロボットが多すぎて、IPv 4プロトコルを使用してもロボットごとに一意にマークできません.トムはIpv 6プロトコルが無限近くのアドレスを持っていると聞いて、IPv 6プロトコルでロボットにIPアドレスを設定しようとした.
ただし、完全なIPv 6アドレスは長く(39文字)、手作業で入力するのに時間がかかるため、IPv 6には簡略化されたメカニズムがあります.
IPv 6のアドレス定義は以下の通りである:IPv 6のアドレスは128ビットで、16ビットを1パケットとし、各16ビットパケットは4つの16進数とし、中間はコロンで分割され、コロン分16進数フォーマットと呼ばれる.例えば、21 DA:00 D 3:0000:2 F 3 B:02 AA:00 FF:FE 28:9 C 5 Aは完全なIPv 6アドレスである.
IPv 6アドレスの各16ビットパケットの先頭ゼロビットは簡略化された表現として除去することができるが、各パケットは少なくとも1ビットの数字を保持しなければならない.上記の例のアドレスのように、プリアンブルゼロビットを除去した後、21 DA:D 3:0:2 F 3 B:2 AA:FF:FE 28:9 C 5 Aと書くことができる
一部のアドレスには長いゼロシーケンスが含まれている場合がありますが、表現をさらに簡略化するために、隣接するパケットの連続ゼロビットを、2つのコロン":"で表すこともできます.「::」記号は1つのアドレスに1回しか現れず、アドレスの前部と末部に隣接する連続ゼロビットを圧縮するためにも使用できます.注意:(個別の0パケットでは「::」は省略できません.
例えば、アドレス:サンプル1:1080:0:0:0:0:8:800:200 C:417 Aは圧縮形式1080:8:800:200 C:417 Aサンプル2:0:0:0:0:0:0:0:0:0:0:0:0:1は圧縮形式:::1サンプル3:0:0:0:0:0:0:0:0:0:0:0:0は圧縮形式:::
今、トムはあなたにIPv 6アドレスをあげました.プログラムを書いて、それらを完全なアドレスに変換してください.
入力フォーマット
第1の動作は、N個のIPアドレスがあることを示す正の整数Nである.次にn行があり、各行に空でない文字列があり、アドレスを表します.入力には、数字、大文字、コロン(:)、改行のみが含まれ、行ごとに39文字を超えないように入力します.
出力フォーマット
合計N行を出力し、行ごとに文字列を1つずつ出力します.入力された文字列ごとに、IPv 6規格を満たしている場合は、対応する完全なIPv 6アドレスが出力され、そうでない場合は「INVALID」が出力されます.
サンプルデータ1
[コピー]を入力
4
1080::8:800:200C:417A
::1
::
1234567890ABCDEF
しゅつりょく
1080:0000:0000:0000:0008:0800:200C:417A
0000:0000:0000:0000:0000:0000:0000:0001
0000:0000:0000:0000:0000:0000:0000:0000
INVALID
コメント
【データ範囲】
100%のデータに対して、保証:1≦N≦35
個人情報:
この問題は比較的に穴があいていて、多くの情況が討論する必要があって、N回試してやっとAC..............................
そして最後にcompile errorの原因を発見しました.
これを打つのを忘れた・・・・
#include
#include
正解は以下の通りです.
バージョン1(オリジナル):
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,len,tot1,tot2,kong,ong,index,num;
char ip[40],out[40];
bool dd,hh,more;
int main()
{
freopen("ipv6.in","r",stdin);
freopen("ipv6.out","w",stdout);
cin>>n;
while(n>0)
{
memset(ip,0,sizeof(ip));
scanf("%s",ip);
len=strlen(ip);
tot1=0,tot2=0;
kong=0,index=0,ong=0;
dd=hh=more=false;
for(int i=0;i4) hh=true;
if(ip[i]>'F') more=true;
if(ip[i]==':') tot2++,tot1=0,kong++;
if(tot2>2) hh=true;
if(tot2==2)
{
if(dd==true) more=true;
else dd=true,index=kong;
}
}
if((ip[0]==':'&&ip[1]!=':')||(ip[len-1]==':'&&ip[len-2]!=':')||ong>8) more=true;
if((ong<8&&dd==false)||(ong>=7&&dd==true)) more=true;
if(kong>7&&dd==true) more=true;
tot1=0,tot2=0,num=0;
if(hh==false&&more==false)
{
for(int i=0;i=1;j--) cout<=1;j--) cout<=1;j--) cout<=1;j--) cout<
バージョン2(teacherの問題解)(
#include
#include
#include
#include
#include
#include
#include
using namespace std;
char s[100],a[100];
int main()
{
freopen("ipv6.in","r",stdin);
freopen("ipv6.out","w",stdout);
int n;
scanf("%d
",&n);
for(int ii=1;ii<=n;ii++)
{
memset(s,'0',sizeof(s));
memset(a,'0',sizeof(a));
char c;
int p1=0,p2=0,p3=0,p4=0,k=0,point=0;
while((c=getchar())!=EOF && c!='
')
{
s[++k]=c;
if(c==':') {
p1=0; p2++;
}
else p1++;
if(p1>4 || p2>7) p4=1;
if(c==':' && s[k-1]==':') {
p3++;point=k;
}
if(p3>1) p4=1;
}
if(!p3 && p2<7) p4=1;
if(p3 && p2==7 && point!=2 && point!=k) p4=1;
for(int i=1;i<=k;i++)
a[i]=s[k-i+1];
if(p4)
{
printf("INVALID
");continue;
}
int q=0;
p1=0;
for(int i=1;i<=k;i++)
{
s[++q]=a[i];
p1++;
if(a[i]==':')
{
q--;
while(p1<5)
{
s[++q]='0';
p1++;
}
s[++q]=':';
p1=0;
if(a[i+1]==':')
{
while(p2<=7)
{
for(int j=1;j<=4;j++)
s[++q]='0';
s[++q]=':';
p2++;
}
q--;
p1=4;
}
}
}
for(int i=39;i>=1;i--) printf("%c",s[i]);
cout<
バージョン3(ある同級生の、あまりにも個性的だから..):
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,len,top,next[25],figure[25];
char str[25];
void move()
{
for(int i=len;i>=1;i--)
str[i]=str[i-1];
return;
}
int main()
{
freopen("ipv6.in","r",stdin);
freopen("ipv6.out","w",stdout);
scanf("%d",&n);
for(int p=1;p<=n;p++)
{
scanf("%s",str);
len=strlen(str);
if(str[1]!=':'&&str[0]==':')
{
cout<=3)
{
judge=false;
break;
}
if(check==2)
{
repeat++;
if(repeat>=2)
{
judge=false;
break;
}
}
}
}
if(top>8)
judge=false;
if(repeat==0&&top<8)
judge=false;
if(repeat==1&&top>=7)
judge=false;
if(!judge)
{
cout<4)
{
judge=true;
break;
}
}
if(judge)
{
cout<=7)
{
judge=true;
break;
}
}
if(next[i]-(next[i-1]+figure[i-1]-1)>3)
{
judge=true;
break;
}
}
if(judge)
{
cout<