A Common Prefixes
题意
- 链接:Common Prefixes
- 给出一个长度为n的数组,其中a[i]表示字符串s[i-1]与s[i]的最长公共前缀的长度,求出字符串数组(任意解)
解题思路
- 找出a[i]的最大值为所有字符串的长度
- 第0个字符串任意,为方便我们设为“aaa……aa”
- 第i个字符串,在上一个字符串的a[i]位置++就可以了
要注意字符串由小写母组成,要处理一下超过z的情况
代码
#include<stdio.h>
#include<algorithm>
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\n",s);
for(int i=1;i<=n;i++)
{
s[a[i]]++;
if(s[a[i]]>'z')s[a[i]]='a';
printf("%s\n",s);
}
}
return 0;
}
C String Transformation 1
题意
解题思路
- 需要注意的是:aab变成bcc
不是一个字符一个字符变3次最优
而是1:aab变bbb 然后 2:bbb变bcc - 暴力:枚举a-t这20个字符,找出A中相同的字符,全部变成B中对应的最小字符
代码
#include<stdio.h>
#include<algorithm>
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",&n);
scanf("%s\n%s\n",a,b);
int flag=0;
for(int i=0;i<n;i++)
if(a[i]>b[i])
{
printf("-1\n");
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');
}
if(tmp==INF)continue;
for(int i=0;i<n;i++)
{
if(a[i]=='a'+j&&a[i]!=b[i])a[i]=tmp+'a';
}
ans++;
}
printf("%d\n",ans);
}
}
return 0;
}