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 ;
}