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. 1 -> 2 ,设 z 为未出现过的字母,那么 p = p + z ,u = u + z,S = pzz(u 从空串变成 z),
  2. k -> 2k+1,那么 p = p + z,u = u + z + z,后面的 uzz 对应 2k,加上前面的 pz 对应 1,
  3. 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;
}
posted @ 2017-06-09 09:55  ftae  阅读(190)  评论(0编辑  收藏  举报