- 题目涉及到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;
}