第一题: 盾盾的打字机 (drdrd) 
【题目描述】 
盾盾有一个非常有意思的打字机,现在盾哥要用这台打字机来打出一段文章。 
由于有了上次的经验,盾盾预先准备好了一段模板 A 存在了内存中,并以此为基础来 
打出文章 B。盾盾每次操作可以将内存中的某一个字符改成另一个字符,或者在某一个位置 
插入一个字符,或者删除某一个位置上的字符。另外,为了避免自己预存的模板太腿反而浪 
费时间,盾哥在所有操作之前会斟酌一下选择留下模板 A 的某一个最优的子串以保证操作 
次数尽量少(当然盾盾也可以全保留或一个都不留),这一步不计入操作次数。 
试求盾盾要打出文章 B 的最少操作次数。 
子串是指母串中连续的一段。 
【输入数据】 
输入包含多组数据。 
对于每组数据,两行,分别表示 A 和 B。 
【输出数据】 
每组数据一行,一个数,表示最少操作次数。 
【输入样例】 
aaaaa 
aaa 
abcabc 
bcd 
abcdef 
klmnopq 
【输出样例】 
0 1 7 
【 数据约定】 
30% : |A|, |B| <= 10 
100% : 1 <= |A|, |B| <= 1000, 数据组数 <= 10, 输入的串中只包含小写字 

用状态 f[i][j]表示第一个串到了第 i 位,第二个串到了第 j 为的最优值,转移就枚举下一
位怎么做。
注意边界条件。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define INF 0x7fffffff
#define MAXN 1010

int dp[MAXN][MAXN];

char a[MAXN],b[MAXN];

int lena,lenb;

int check(int x,int y)
{
if (x!=y)
return 1;
return 0;
}

bool work()
{
for (int i=0;i<=lena-lenb;i++)
if (strncmp(a+i,b,lenb)==0)
return true;
return false;
}

int main()
{
freopen("drdrd.in","r",stdin);freopen("drdrd.out","w",stdout);
while (scanf("%s",a)!=EOF)
{
memset(dp,127/3,sizeof(dp));
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
if (lena>=lenb && work())
{
printf("0\n");
continue;
}
for (int i=0;i<=lena;i++)
{
dp[i][0]=0;
for (int j=0;j<=lenb;j++)
{
dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j]+check(a[i],b[j]));
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1);
dp[i][j+1]=min(dp[i][j+1],dp[i][j]+1);
}
}
int ans=INF;
for (int i=0;i<=lena;i++)
ans=min(ans,dp[i][lenb]);
printf("%d\n",ans);
}
return 0;
}

【样例解释】
{(1, 2), (1, 3)} {(1, 2), (2, 3)} {(1, 2), (4, 3)} {(1, 3), (3, 2)}
{(1, 3), (4, 2)} {(4, 2), (2, 3)} {(4, 2), (4, 3)} {(4, 3), (3, 2)}
【数据约定】
30% : N <= 10
另 20% : M = 0
100 : N <= 10 ^ 5, M <= 10 ^ 5, 1 <= P <= 10 ^ 9

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define N 100010

LL n,m,p;
LL ans;

int t;
int x,y;
int f[N],g[N];

int find(int x)
{
return f[x]==x ? x : f[x]=find(f[x]);
}

int PowerMod(int a, int b, int c)
{

LL ans=1;
LL k=a%c;
while (b)
{
if (b&1)
ans=1LL*ans*k%c;
b>>=1;
k=1LL*k*k%c;
}
return ans;
}

int main()
{
freopen("netrd.in","r",stdin);freopen("netrd.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&p);
if (!m)
{
LL ans=PowerMod(n,n-2,p);
printf("%lld\n",ans);
return 0;
}
for (int i=1;i<=n;i++)
f[i]=i;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
f[find(x)]=find(y);
}
for (int i=1;i<=n;i++)
g[find(i)]++,t+=(f[i]==i);
if (t==1)
{
printf("%d",1%p);
return 0;
}
LL ans=PowerMod(n,t-2,p);
for (int i=1;i<=n;i++)
if (g[i])
ans=1LL*ans*g[i]%p;
printf("%lld",ans);
return 0;
}

树的 prufer 编码
如果把一开始就连在一起的点缩在一起,我们相当于要求一个带“点权”的图的生成树
方案数。
用树的 prufer 编码来考虑。在 prufer 序列中,每个点的度数就是它在其中的出现次数+1,
而每个点的每个度数都可以分配给他真正包含的点中的任意一个,用 a 表示包含的点数,
d 表示度数,所以最后的方案数就是π (a[i] ^ d[i]),在序列中每次考虑往后加一个数,都
有∑d[i] = n 种选择,所以最后的答案就是 n ^ (n-2) * π (a[i])。

HNOI模拟 Day3.22的更多相关文章

  1. HNOI模拟 Day3.25 By Yqc

    怕老婆 [问题描述] 有一天hzy9819,来到了一座大城市拥有了属于他自己的一双滑板鞋.但是他还是不满足想要拥有属于自己的一栋楼,他来到了一条宽敞的大道上,一个一个记录着这些楼的层数以方便自己选择. ...

  2. HNOI模拟 Day3.23

    一.拓扑(top)[ 题目描述]:给你一个有向二分图,求他的拓扑序列的个数.[ 输入]:第一行两个数 N,M,表示点数和边数.接下来 M 行每行两个数 a,b,表示 a 向 b 有一条有向边.[ 输出 ...

  3. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...

  4. JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器

    5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...

  5. 【HNOI模拟By lyp】Day1

    1 xlk1.1 题目描述 给定一棵大小为 n 的无根树,求满足以下条件的四元组 (a, b, c, d) 的个数: 1. 1 ≤ a < b ≤ n 2. 1 ≤ c < d ≤ n 3 ...

  6. NOIP模拟21+22

    模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...

  7. 【模拟7.22】visit(卢卡斯定理&&中国剩余定理)

    如此显然的组合数我把它当DP做,我真是.... 因为起点终点已经确定,我们发现如果我们确定了一个方向的步数其他方向也就确定了 组合数做法1: 设向右走了a步,然后向左走了b=a-n步,设向上为c,向下 ...

  8. 3194. 【HNOI模拟题】化学(无标号无根树计数)

    Problem 求\(n\)个点的每个点度数不超过\(4\)的无标号无根树个数. Data constraint \(1\le n\le 500\) Solution 尝试着把问题一般化.我们来考虑一 ...

  9. jzoj5879. 【NOIP2018提高组模拟9.22】电路图 B

    tj:一道好題 看區間操作可以想到線段樹 並聯操作公式:a1∗a2/(a1+a2)a1*a2/(a1+a2)a1∗a2/(a1+a2) 串聯操作公式:a1+a2a1+a2a1+a2 我們發現,一個區間 ...

随机推荐

  1. sphinx配置

    配置文件 ## 数据源src1 source src1 { ## 说明数据源的类型.数据源的类型可以是:mysql,pgsql,mssql,xmlpipe,odbc,python ## 有人会奇怪,p ...

  2. loaction.reload(false)和location.reload(true) js发起请求

    loaction.reload(false)和location.reload(true)差别: loaction.reload(false) 先判断页面有没修改,有的话就从服务器下载页面,没有就直接从 ...

  3. vue 子组件修改父组件变量问题

    昨天遇到一个这样的场景, 主页面引用了一个子页面,子页面有个Redio选择,2个选项. 默认的,会从父组件传递一个参数给子组件作为默认值,实现默认选中效果,以及用来做反选. 开始没什么问题,页面都摆上 ...

  4. UE4 插件扩展引擎工具栏

    UE4 作为游戏引擎,已经提供了非常强大的游戏开发的API.作为游戏制作者来讲,我们需要一些专用的功能辅助我们更好的开发游戏,而不是仅仅从构建游戏逻辑出发.因此也就有了扩展编辑器功能的这个想法,还好 ...

  5. xtu summer individual 3 F - Opening Portals

    Opening Portals Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  6. xtu summer individual 6 B - Number Busters

    Number Busters Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  7. 修改windows 2012/win8、win7远程桌面连接默认端口的方法

    远程桌面连接服务基于端口3389,入侵者一般先扫描主机开放端口,一旦发现其开放了3389端口,就会进行下一步的入侵,所以我们只需要修改该务默认端口就可以避开大多数入侵者的耳目. 修改windows 2 ...

  8. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  9. 洛谷——P1044 栈

    P1044 栈——卡特兰数 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈) ...

  10. Java高并发实战,锁的优化

    锁优化 这里的锁优化主要是指 JVM 对 synchronized 的优化. 自旋锁 互斥同步进入阻塞状态的开销都很大,应该尽量避免.在许多应用中,共享数据的锁定状态只会持续很短的一段时间.自旋锁的思 ...