H. Fake News (medium)
H. Fake News (medium)
题意
以前是给出 S T 串,问在 S 中有多少个子串为 T 的个数,子串可以不连续,保持位置相对一致。
现在给出 n ,要你构造 S T 串。
分析
这种 special judge 的题目也是清奇。
设 S 为文本串,p 为模式串,设 S = p + u,初始设 p = "a",u 为空串,那么初始 S 串中匹配到的数量 k = 1,
- 1 -> 2 ,设 z 为未出现过的字母,那么 p = p + z ,u = u + z,S = pzz(u 从空串变成 z),
- k -> 2k+1,那么 p = p + z,u = u + z + z,后面的 uzz 对应 2k,加上前面的 pz 对应 1,
- k -> 2k+2,p = p + z,u = z + u + z + z,那么 S = pzzuzz 。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
string p, u;
char c;
void so(int n) {
if(n == 1) {
p = "";
c = 'a';
p += c;
u = "";
c++;
} else if(n == 2) {
so(n / 2);
p = p + c;
u = u + c;
c++;
} else {
if(n & 1) {
so((n - 1) / 2);
p = p + c;
u = u + c + c;
c++;
} else {
so((n - 2) / 2);
p = p + c;
string c_;
c_ += c;
u = c_ + u + c + c;
c++;
}
}
}
int main() {
int n;
while(cin >> n) {
so(n);
cout << p + u << " " << p << endl;
}
return 0;
}