牛客IOI周赛23-普及组
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;
} 