D. Unique Palindromes

D. Unique Palindromes

A palindrome is a string that reads the same backwards as forwards. For example, the string abcba is palindrome, while the string abca is not.

Let p(t) be the number of unique palindromic substrings of string t, i. e. the number of substrings t[lr] that are palindromes themselves. Even if some substring occurs in t several times, it's counted exactly once. (The whole string t is also counted as a substring of t).

For example, string t = abcbbcabcb has p(t)=6 unique palindromic substrings: a, b, c, bb, bcb and cbbc.

Now, let's define p(s,m)=p(t) where t=s[1m]. In other words, p(s,m) is the number of palindromic substrings in the prefix of s of length m. For example, p(abcbbcabcb,5) = p(abcbb)=5.

You are given an integer n and k "conditions" (k20). Let's say that string s, consisting of n lowercase Latin letters, is good if all k conditions are satisfied at the same time. A condition is a pair (xi,ci) and have the following meaning:

  • p(s,xi)=ci, i. e. a prefix of s of length xi contains exactly ci unique palindromic substrings.

Find a good string s or report that such s doesn't exist.
Look in Notes if you need further clarifications.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1t104). The description of the test cases follows.

The first line of each test case contains two integers n and k (3n2105; 1k20) — length of good string s and number of conditions.

The second line of each test case contains k integers x1,x2,,xk (3x1<x2<<xk=n) where xi is the length of the prefix in the i-th condition.

The third line of each test case contains k integers c1,c2,,ck (3c1c2ckmin(109,(n+1)n2)) where ci is the number of palindromic substrings in the i-th condition.

It is guaranteed that the sum of n over all test cases does not exceed 2105.

Output

For each test case, if there is no good string s of length n that satisfies all conditions, print NO.

Otherwise, print YES and a string s of length n, consisting of lowercase Latin letters, that satisfies all conditions. If there are multiple answers, print any of them.

Example

input

复制代码
7
10 2
5 10
5 6
3 1
3
3
4 2
3 4
3 3
4 2
3 4
3 4
4 1
4
5
10 3
4 6 10
4 5 8
10 4
4 6 7 10
4 5 7 8
复制代码

output

复制代码
YES
abcbbcabcb
YES
foo
YES
ayda
YES
wada
NO
YES
abcbcacbab
NO
复制代码

Note

In the first test case, string s = abcbbcabcb satisfies k=2 conditions:

  • p(s,x1)=p(s,5)= p(abcbb)=5=s1. Palindromic substrings are a, b, c, bb and bcb.
  • p(s,x2)=p(s,10)= p(abcbbcabcb)=6=s2. Palindromic substrings are the same as above, and one extra substring cbbc.

In the second test case, string foo satisfies k=1 condition:

  • p(foo)=3. Palindromic substrings are f, o and oo.

There are other possible answers.
In the third test case, string ayda satisfies k=2 conditions:

  • p(ayd)=3. Palindromic substrings are a, y and d.
  • p(ayda)=3. Palindromic substrings are the same.

In the fourth test case, string wada satisfies k=2 conditions:

  • p(wad)=3. Palindromic substrings are w, a and d.
  • p(wada)=4. Palindromic substrings are the same, and one extra substring ada.

In the fifth test case, it can be proven that there is no string of length 4 which has 5 palindromic substrings.

In the sixth test case, string abcbcacbab satisfies k=3 conditions:

  • p(abcb)=4. Palindromic substrings are a, b, c and bcb.
  • p(abcbca)=5. Palindromic substrings are the same, and one extra substring cbc.
  • p(abcbcacbab)=8. Palindromic substrings are the same, and three extra substrings cac, bab and bcacb.

 

解题思路

  先手动模拟n较小的情况,看看唯一回文子串个数P是多少。

  如果n=1,那么P=1

  如果n=2,只有两种情况 aa 和 ab ,都有P=2

  如果n=3,有4种情况,即分别考虑第2个与第3个字符是否与前一个相同,那么就有22种。即 aaaaababaabc,都有P=3。这也是为什么数据中的xc都至少为3

  如果n>3,那么前3个字符对P已经有3个贡献,如果往字符串最后添加一个字符c,那么新的字符串的Pnew只能比之前的Pold增加01。反证法,假设PnewPold2,那么选择出两个新的回文子串,这两个新的回文子串的结尾字符必然是c,并且这两个回文子串的长度必然不一样。不妨设长度大的子串s1的左端点为i,长度小的子串s2的左端点为j,那么有i<j,两个回文子串的右端点均为k(即字符c的位置)。根据回文的定义,s2必然是s1的前缀与后缀,可以参考下图:

  回文子串[j, k][i, i+kj]是同一个,而我们已经把前面的[i,i+kj]统计到Pold了。所以如果存在以c结尾的回文子串那么应该只统计长度最长的那一个,因为任何短的回文子串在之前已经统计过了。故多加一个字符最多会使得P增加1

  我们先构造出一些特别的子串,P=n时有 aaaaaa... ;P=3时有 abcabc... 。

  然后我们先考虑k=1的情况,即只有一个约束条件。首先根据上面的结论知道如果c1>x1,那么无解。否则先构造出c13个 a(注意ci3),然后用 abc 填补直到字符串的长度为n。那么就会得到这种形式:aaa...aaabcabc... 。

  考虑k>1。首先如果cici1>xixi1,那么无解,因为添加xixi1个字符最多使得P增加xixi1。否则我们任取一个之前没用过的字符d(由于最多只有20个约束,因此26个小写字母足够用),然后往答案后面添加cici1d,然后再用 abc 去填充直到字符的长度变成xi。那么得到的字符串就会是这种形式,其中表示 | 各个约束的边界: aaaaaaaaabcabcab|dddddcabcabca|eeebcab 。

  注意到每次填充 abc 都是从上一次结束字符的下一个开始,比如上一次约束最后填充到 a ,那么下一次应该从 b 开始继续填充,这样做可以避免产生不必要的回文。否则比如 ...ddabca|eabc... ,那么就会形成回文 aea 。

  AC代码如下:

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 2e5 + 10;
 5 
 6 int x[N], c[N];
 7 
 8 void solve() {
 9     int n, m;
10     scanf("%d %d", &n, &m);
11     for (int i = 0; i < m; i++) {
12         scanf("%d", x + i);
13     }
14     for (int i = 0; i < m; i++) {
15         scanf("%d", c + i);
16     }
17     if (c[0] > x[0]) {    // P<=n 
18         printf("NO\n");
19         return;
20     }
21     string ans;
22     int t = 0;
23     // 处理第一个约束 
24     for (int i = 0; i < c[0] - 3; i++) {
25         ans += 'a';
26     }
27     for (int i = c[0] - 3; i < x[0]; i++) {
28         ans += 'a' + t;
29         t = (t + 1) % 3;
30     }
31     //处理剩下的约束 
32     for (int i = 1; i < m; i++) {
33         if (c[i] - c[i - 1] > x[i] - x[i - 1]) {
34             printf("NO\n");
35             return;
36         }
37         for (int j = c[i - 1]; j < c[i]; j++) {    // 添加c[i]-c[i-1]个之前没出现过的字符 
38             ans += 'c' + i;
39         }
40         while (ans.size() < x[i]) {    // 用abc填补到长度x[i] 
41             ans += 'a' + t;
42             t = (t + 1) % 3;
43         }
44     }
45     while (ans.size() < n) {    // 记得最后把字符串填补到长度n 
46         ans += 'a' + t;
47         t = (t + 1) % 3;
48     }
49     printf("YES\n%s\n", ans.c_str());
50 }
51 
52 int main() {
53     int t;
54     scanf("%d", &t);
55     while (t--) {
56         solve();
57     }
58     
59     return 0;
60 }
复制代码

 

参考资料

  Codeforces Round #868 (Div.2) Editorial:https://codeforces.com/blog/entry/115465

posted @   onlyblues  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示