题面:https://www.cnblogs.com/Juve/articles/11599318.html

antipalindome:

打表找规律?

对于一个回文串,我们只要保证3位以内不回文即可,即只要不出现三位以内回文就合法

对于前三位:m*(m-1)*(m-2),剩下的n-3个位置用m-2来填

所以$ans=m*(m-1)*(m-2)^(n-2)$,注意边界的判断

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int mod=1e9+7;
const int phi=1e9+6;
int t,n,m,ans=0;
int q_pow(int a,int b,int p){
a%=p;
(b+=(p-1))%=(p-1);
int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res%p;
}
signed main(){
scanf("%lld",&t);
while(t--){
ans=0;
scanf("%lld%lld",&n,&m);
if(n==1){
printf("%lld\n",m%mod);
continue;
}else if(m==1){
puts("0");
continue;
}else if(m==2&&n==2){
puts("2");
continue;
}else{
ans=q_pow(m-2,n-2,mod)%mod;
for(int i=m;i>=m-1;--i){
(ans*=(i%mod))%=mod;
}
printf("%lld\n",ans);
}
}
return 0;
}

randomwalking:

树形dp,感觉它贼麻烦,博主也是不会了

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=1e6+4;
const double inf=110000000000000000.0;
int n,a[MAXN],du[MAXN],ans;
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
double f[MAXN],g[MAXN],minn=inf;
void dfs(int x,int fa){
f[x]=(double)a[x];
if(du[x]==1&&fa!=0){
return ;
}
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
dfs(y,x);
if(fa!=0&&du[x]!=1) f[x]+=(double)f[y]/(double)((double)du[x]-1.0);
else f[x]+=(double)f[y]/du[x];
}
}
void DFS(int x,int fa){
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
g[y]=(double)a[y];
double tmp1=(double)(g[x]-(double)a[x])*(double)du[x];
double tmp2=tmp1-f[y];
double tmp3=(double)(f[y]-(double)a[y])*(double)(du[y]-1.0);
if(du[x]>1) g[y]+=(double)(tmp2/(double)(du[x]-1.0)+(double)a[x]+tmp3)/(double)(du[y]);
else g[y]+=(double)((double)a[x]+tmp3)/(double)(du[y]);
DFS(y,x);
}
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(int i=1,u,v;i<n;++i){
scanf("%lld%lld",&u,&v);
add(u,v),add(v,u);
++du[u],++du[v];
}
dfs(1,0);
g[1]=f[1];
DFS(1,0);
minn=g[1],ans=1;
for(int i=1;i<=n;++i){
if(g[i]<minn){
ans=i;
minn=g[i];
}
}
printf("%lld\n",ans);
return 0;
}

string:

先翻转,然后用并差集维护相同颜色的位置

然后把k化成26进制数,对于不能确定的点用k的26进制数去确定

区间反转用平衡树

我们给 ′ a ′ 到 ′ z ′ 编号为 [1, 26] ,再给每个 ′ ? ′ 一个大于 26 的不同的标号,输入的串变成了一个这样的数字串,计
为 S .
我们直接对这个数字串去做操作,得到一个新的数字串,记为 T .
这件事就是这个经典的问题bzoj3223:Tyvj1729文艺平衡树.
直接把 S 和 T 的每一位用并查集并起来,表示这些标号所代表的字符一定是相同的.
如果一个联通块内包含至少一个字母,那么这个联通块的字符都确定了.
否则有 26 种可能,扫一遍直接分配即可.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=5e5+5;
int n,m,k,l[MAXN],r[MAXN],b[MAXN];
char ch[MAXN];
bool pd[MAXN];
struct node1{
int val,pos;
}a[MAXN];
int fa[MAXN];
int find(int x){
return fa[x]=(fa[x]==x?x:find(fa[x]));
}
void merge(int x,int y){
x=find(x),y=find(y);
fa[max(x,y)]=min(x,y);
}
vector<int>v[MAXN];
int col[MAXN],tot=-1;
struct Node{
bool rev;
int s,h,v;
Node *l,*r;
}*root=0;
struct tbw{
Node *l,*r;
tbw(){}
tbw(Node *a,Node *b){l=a,r=b;}
};
int gets(Node *x){return x?x->s:0;}
void update(Node *x){x->s=gets(x->l)+1+gets(x->r);}
void rev(Node *x){
if(!x) return;
x->rev ^=1;
swap(x->l,x->r);
}
void down(Node *x){
if(x->rev) rev(x->l),rev(x->r),x->rev=0;
}
Node *merge(Node *a,Node *b){
if(!a) return b;
if(!b) return a;
if (a->h<b->h){
down(a);
a->r=merge(a->r,b);
update(a);
return a;
}
down(b);
b->l=merge(a,b->l);
update(b);
return b;
}
tbw split(Node *x,int k){
if(!x) return tbw(0,0);
down(x);
int tot=gets(x->l)+1;
if(k<tot){
tbw a=split(x->l,k);
x->l=a.r;
update(x);
return tbw(a.l,x);
}
tbw a=split(x->r,k-tot);
x->r=a.l;
update(x);
return tbw(x,a.r);
}
void insert(int v){
Node *x=new Node;
x->h=rand(),x->l=x->r=0;
x->v=v,x->s=1;
root=merge(root,x);
}
void rev(int l,int r){
tbw a=split(root,l-1);
tbw b=split(a.r,r-l+1);
rev(b.l);
root=merge(merge(a.l,b.l),b.r);
}
int num=0;
void print(Node *x){
if(!x) return;
down(x);
print(x->l);
b[++num]=x->v;
print(x->r);
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&k);
scanf("%s",ch+1);
for(int i=1;i<=n;++i){
fa[i]=a[i].pos=b[i]=i;
a[i].val=0;
if(ch[i]!='?'){
a[i].val=ch[i]-'a'+1;
pd[i]=1;
}
insert(i);
}
for(int i=1;i<=m;++i){
scanf("%lld%lld",&l[i],&r[i]);
rev(l[i],r[i]);
}
print(root);
for(int i=1;i<=n;++i){
merge(b[i],i);
}
for(int i=1;i<=n;++i){
int x=find(i);
v[x].push_back(i);
if(a[x].val!=0) col[x]=a[x].val;
else if(a[i].val!=0) col[x]=a[i].val;
}
for(int i=1;i<=n;++i){
int x=find(i);
if(col[x]==0) continue;
a[i].val=col[x];
}
for(int i=1;i<=n;++i){
if(col[i]==0&&v[i].size()!=0) ++tot;
}
for(int i=1;i<=n;++i){
int x=find(i);
if(a[i].val!=0) continue;
else if(x!=i) a[i].val=a[x].val;
else if(tot>13) a[i].val=1,--tot;
else{
int p=pow(26,tot--);
int x=k/p;
if(k%p) ++x;
a[i].val=x--;
k-=x*p;
}
}
for(int i=1;i<=n;++i){
putchar(a[i].val+'a'-1);
}
puts("");
return 0;
}

csp-s模拟测试b组加餐antipalindome,randomwalking,string题解的更多相关文章

  1. csps模拟测试74梦境,玩具,飘雪圣域题解

    题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...

  2. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...

  3. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

  4. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  5. 「CSP」第一届提高组考后总结

    「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...

  6. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  7. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  8. 使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决

    依赖:这个很重要,不同版本用法也有点区别: <dependency> <groupId>org.mockito</groupId> <artifactId&g ...

  9. Mac下Jmeter快速安装与入门-模拟测试Post请求及设置Http头

    [1]去Apache官网下载 Binaries系列的最新Jmeter.gz包 [2]下载到本地之后解压缩,进入到解压之后的目录然后,找到apache-jmeter-4.0/bin/jmeter.sh ...

随机推荐

  1. GCRoots 对象

    GC Roots 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 原生方法栈(Native Method Stack)中 JNI 中引用的对象 可 ...

  2. (一)PHP基础知识考察点

    1,PHP引用变量的考察点: 概念:引用就是用不同的名字访问同一个变量内容. 定义方式: 使用&符号. PHP引用变量的工作原理 这里有个COW  copy on write  用zval() ...

  3. shell启停服务脚本模板

    一. 启动脚本模板:符合幂等性 如果该服务已经启动,再次调用该脚本,不会报错,也就是说可以反复多次调用,另外启动成功返回 一个参数,提供给自动发布平台校验该服务是否启动 #!/bin/bash ins ...

  4. 多线程--GIL锁

    GIL 即全局解释器锁,是一个互斥锁,防止多个线程在同一时间执行python代码,因为在一个python进程中,不仅有主线程而且还有该主线程开启的子线程,还有解释器开启的垃圾回收机等解释器级别的线程. ...

  5. POJ - 3294~Relevant Phrases of Annihilation SPOJ - PHRASES~Substrings POJ - 1226~POJ - 3450 ~ POJ - 3080 (后缀数组求解多个串的公共字串问题)

    多个字符串的相关问题 这类问题的一个常用做法是,先将所有的字符串连接起来, 然后求后缀数组 和 height 数组,再利用 height 数组进行求解. 这中间可能需要二分答案. POJ - 3294 ...

  6. (function($){….})(jQuery)与$(function(){})的区别

    function fun($){…};fun(jQuery);这种方法多用于存放开发的插件,执行其中的代码时,Dom对象并不一定加载完毕. $(function(){})等价于$(document). ...

  7. more 和less 命令简单介绍以及使用

    一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...

  8. 2019-8-31-dotnet-获取程序所在路径的方法

    title author date CreateTime categories dotnet 获取程序所在路径的方法 lindexi 2019-08-31 16:55:58 +0800 2019-03 ...

  9. Android开发 EditText的开发记录

    设置显示内容与隐藏内容 if (isChecked){ editPassword.setTransformationMethod(HideReturnsTransformationMethod.get ...

  10. 开发函数计算的正确姿势 —— 使用 ROS 进行资源编排

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...