Codeforces Round #659 (Div. 2) A 、C
15895 ワード
目次 A Common Prefixes 題意 解題構想 コード C String Transformation 1 題意 解題構想 コード A Common Prefixes
に言及リンク:Common Prefixes は長さnの配列を与え、ここでa[i]は文字列s[i-1]とs[i]の最長共通接頭辞の長さを表し、文字列配列(任意解) を求める.
問題を解く構想. a[i]の最大値は、すべての文字列の長さ である. 0番目の文字列は任意で、便宜上「aaa......aa」 に設定します.のi番目の文字列は、前の文字列のa[i]位置++でよい文字列は小文字の母で構成されていることに注意し、zを超える場合 を処理する.
コード#コード#
C String Transformation 1
に言及リンク:String Transformation 1 a-tからなる2つの文字列AとBを与えて、列Aを列Bに変える最小回数を求めて、毎回Aの中の1つ以上の同じ文字をそれより大きいものに変えることができて、もしB出力"-1" にならないならば
問題を解く構想. aabがbccになるのは、1文字1文字が3回変わるのではなく、1:aabがbbbになり、2:bbbがbccになる であることに注意してください.暴力:a-tの20文字を列挙し、Aの同じ文字を探し出し、すべてBの対応する最小文字 になる.
コード#コード#
に言及
問題を解く構想.
コード#コード#
#include
#include
using namespace std;
int t,x,n,a[202],maxn;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
maxn=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxn=max(a[i],maxn);
}
char s[202];
maxn++;
for(int i=0;i<maxn;i++)s[i]='a';
s[maxn]='\0';
printf("%s
",s);
for(int i=1;i<=n;i++)
{
s[a[i]]++;
if(s[a[i]]>'z')s[a[i]]='a';
printf("%s
",s);
}
}
return 0;
}
C String Transformation 1
に言及
問題を解く構想.
コード#コード#
#include
#include
using namespace std;
const int INF=0x7f7f7f7f;
const int N=1e5+5;
int t,n;
char a[N],b[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d
",&n);
scanf("%s
%s
",a,b);
int flag=0;
for(int i=0;i<n;i++)
if(a[i]>b[i])
{
printf("-1
");
flag=1;
break;
}
if(!flag)
{
int ans=0;
for(int j=0;j<20;j++)//
{
int tmp=INF;
for(int i=0;i<n;i++)
{
if(a[i]=='a'+j&&a[i]!=b[i])tmp=min(tmp,b[i]-'a');// b
}
if(tmp==INF)continue;
for(int i=0;i<n;i++)
{
if(a[i]=='a'+j&&a[i]!=b[i])a[i]=tmp+'a';// b
}
ans++;
}
printf("%d
",ans);
}
}
return 0;
}