A、小L的作文

模拟

MyCode:

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define eb emplace_back
#define ef emplace_front
#define ep emplace
#define fi first
#define se second
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int ans(0);
    string s;
    char x;
    cin>>x>>s;
    for(auto y:s) {
        if(y==x) ans+=1;
    }
    cout<<ans<<'\n';
    return 0;
}

B、小L的多项式

思路:
n、m比较小可以直接暴力
下标从大到小扫一遍,通过每次,同时求出所有项

MyCode:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7,mod=998244353;
typedef long long ll;
#define eb emplace_back
#define ef emplace_front
#define ep emplace
#define fi first
#define se second
int a[10005];
int main() {
    int n;
    scanf("%d",&n);
    for(int i=0;i<=n;++i) scanf("%d",&a[i]);
    int q,x;
    scanf("%d",&q);
    ll ans;
    while(q--) {
        scanf("%d",&x);
        ans=0;
        for(int i=n;~i;--i) ans=(ans*x+a[i])%mod;
        printf("%lld ",ans);
    }
    return 0;
}

C、小L的编辑器

思路:
当光标在输入完的字符右边时,这个字符的位置已经确定了,可以直接输出
当光标在输入完的字符左边时,位置还不确定,由于每次输入的字符都会在它前面,有点类似栈,可以放在栈里面。

MyCode:

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn=1e6+7;
#define eb emplace_back
#define ef emplace_front
#define ep emplace
#define fi first
#define se second
int pos[maxn],n,tot=-1;
char s[maxn],t[maxn],ans[maxn];
stack<char>q;
int main() {
    scanf("%s%s",s,t);
    n=strlen(s);
    for(int i=0;s[i];++i) {
        if(t[i]=='L') q.push(s[i]);
        else ans[++tot]=s[i];
    }
    while(q.size()) {
        ans[++tot]=q.top();
        q.pop();
    }
    ans[++tot]='\0';
    puts(ans);
    return 0;
}

D、小L的数列

思路:
引理:对于质数 ,若存在 都是 的倍数,那么选出的序列一定不会让 相邻。

先筛出1e5以内的所有素数,然后对序列排序
根据定理,对每个数,分解质因数(直接枚举质数来加速),然后有相同的质因数且最靠近它()

MyCode:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
bool vis[maxn];
vector<int>prime;
inline void initial() {
    for (int i = 2; i < maxn ; ++i) {
        if (!vis[i])
            prime.emplace_back(i);
        for (int j = 0,size=prime.size(); j < size; ++j) {
            if (i * prime[j] >= maxn) break;
            vis[i * prime[j]] = true;
            if (i % prime[j] == 0) break;
        }
    }
}
int  dp[maxn] , last[maxn];
bool a[maxn];
inline int max(int a,int b) {
    return a>b?a:b;
}
inline int read() {
    char c=getchar();
    int x=0;
    bool f=0;
    for(; !isdigit(c); c=getchar())f^=!(c^45);
    for(; isdigit(c); c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;
    return x;
}
int main() {
    initial();
    int T = read() , n , k;
    while(T--) {
        n = read();
        memset(last , 0 , sizeof(last));
        memset(a , 0 , sizeof(a));
        for(int i = 1 ; i <= n ; ++i) {
            k = read();
            a[k] = 1;
        }
        int m (0),res=1;
        dp[1] = 1;
        for(int i = 2 ,y; i <= 100000 ; ++i) {
            if(a[i] == 0)   continue;
            dp[y=i]=1;
            for(auto x : prime) {
                if(x > y)   break;
                if(!vis[y]) {
                    if(last[y])
                        dp[i] = max(dp[i] , dp[last[y]] + 1);
                    last[y] = i;
                    break;
                }
                if(y % x == 0) {
                    if(last[x])
                        dp[i] = max(dp[i] , dp[last[x]] + 1);
                    last[x] = i;
                    while(y % x == 0)   y /= x;
                }
            }
            res = max(res , dp[i]);
        }
        printf("%d\n" , res);
    }
    return 0;
}