CFR 795 H. Repairing Of String ( Ad hoc )
題意:
給 C[],C[ i ] 代表長度為 i 的元素種類單一子字串的數量。求構造字串。
制約:
The first line contains the integer n (1 ≤ n ≤ 2000) — the length of the Stepan's favorite string.
The second line contains the sequence of integers c1, c2, ..., cn (0 ≤ ci ≤ 2000), where ci equals the number of substrings of the string s with the length i, consisting of the same letters.
It is guaranteed that the input data is such that the answer always exists.
解法:
考慮最大的非零 C[ i ],顯然一定要有這麼多個長度恰為 i 的元素種類單一字串穿插,( 'a' * i ) + ( 'b' * i ) + ( 'a' * i ) ...。此時,把這些造成的貢獻減去。只要保證答案存在,那麼由 i 大至小依序做一樣的事情即可。
時間 / 空間複雜度:
O( N^2 )
import java.util.Scanner; public class project{ public static void main(String[]args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] C = new int[ N + 1 ]; for( int i = 1; i <= N; ++i ) { C[ i ] = sc.nextInt(); } StringBuilder ans = new StringBuilder(); for( int i = N, t = 0; i >= 1; --i ) { for( int j = 0; j < C[ i ]; ++j, t ^= 1 ) { for( int k = 0; k < i; ++k ) { ans.append( ( char ) ( 'a' + t ) ); } } for( int j = i - 1; j >= 1; --j ) { C[ j ] -= C[ i ] * ( i - j + 1 ); } } System.out.println( ans ); } }