• 题目涉及到16进制,故使用 char 数组来存储数字(0-9)和字母(A-F)。
  • 题目涉及多次进制转换,故将进制转换封装成函数,当需要生成 s(n,k) 时反复调用函数并拼接在一起即可。
  • 生成 s(n,k) 后直接使用 string.find() 来进行查找即可。
// Problem: 子串
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/problem/13253
// Memory Limit: 2 MB
// Time Limit: 13253000 ms
//
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;

char c[16]; // 存储16进制的字符

string f(int m, int n) // 把m转换成n进制
{
    string s = "";
    int l;
    while (m >= n)
    {
        l = m % n; // 低位
        s = c[l] + s;
        m = m / n; // 高位
    }
    s = c[m] + s;
    return s;
}

int main()
{
    c[0] = '0'; // 初始化c[0]
    for (int i = 1; i < 16; i++) // 初始化字符数组
    {
        if (i < 10)
            c[i] = char(48 + i);
        else
            c[i] = char(65 + i - 10);
    }
    int n;
    string t;
    cin >> n >> t;
    for (int k = 2; k <= 16; k++)
    {
        string s = "";
        for (int i = 1; i <= n; i++) // 构造s,在s中找t
        {
            s += f(i, k); // i转化成k进制
        }
        if (s.find(t) != -1)
        {
            cout << "yes" << endl;
            return 0;
        }
    }
    cout << "no" << endl;
    return 0;
}