期望得分:100+100+0=200

实际得分:

坐标的每一位不是0就是1,所以答案就是

C(n,k)

#include<cstdio>
#include<iostream> using namespace std; const int mod=1e9+; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int Pow(int a,int b)
{
int res=;
for(;b;a=1LL*a*a%mod,b>>=)
if(b&) res=1LL*res*a%mod;
return res;
} int main()
{
freopen("cube.in","r",stdin);
freopen("cube.out","w",stdout);
int n,k;
read(n); read(k);
int ans=;
for(int i=;i<=k;i++)
ans=1LL*ans*Pow(i,mod-)%mod*(n-i+)%mod;
cout<<ans;
}

货物一定是走在最大生成树上

如果按限重从大到小加边,那么一个联通块只需要有一个仓库

并查集维护即可

考场代码写的有点儿乱

#include<algorithm>
#include<iostream>
#include<cstdio> using namespace std; #define N 100001 int n,m; int fa[N];
bool cal[N]; int ans[N],tmp[N]; bool vis[N]; struct node
{
int u,v,lim;
bool use;
}e[N]; struct query
{
int id,w;
}a[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp(node p,node q) { return p.lim>q.lim; } bool cmp2(query p,query q) { return p.w>q.w; } bool cmp3(node p,node q)
{
if(p.use!=q.use) return p.use>q.use;
return p.lim>q.lim;
} int find(int i) { return fa[i]==i ? i : fa[i]=find(fa[i]); } void MST()
{
for(int i=;i<=n;i++) fa[i]=i;
int tot=,i=,u,v;
while(tot!=n- && i<m)
{
i++;
u=find(e[i].u); v=find(e[i].v);
if(u==v) continue;
tot++; e[i].use=true;
fa[u]=v;
}
} int main()
{
freopen("warehouse.in","r",stdin);
freopen("warehouse.out","w",stdout);
int q;
read(n); read(m); read(q);
for(int i=;i<=m;i++) read(e[i].u),read(e[i].v),read(e[i].lim);
sort(e+,e+m+,cmp);
for(int i=;i<=q;i++) read(a[i].w),a[i].id=i;
sort(a+,a+q+,cmp2);
MST();
sort(e+,e+m+,cmp3);
for(int i=;i<=n;i++) fa[i]=i;
int ne=,nq=; int sum=n;
while(ne<=m)
{
if(!e[ne].use) break;
while(ne<=m && e[ne].lim>=a[nq].w)
{
if(find(e[ne].u)==find(e[ne].v))
{
ne++;
continue;
}
fa[find(e[ne].u)]=find(e[ne].v);
sum--;
ne++;
}
ans[a[nq].id]=sum;
nq++;
}
for(int i=nq;i<=q;i++) ans[a[i].id]=sum;
for(int i=;i<=q;i++) cout<<ans[i]<<'\n';
}

答案=原词典单词数+前缀后缀拼接单词数

统计前缀和后缀 拼接的单词:

一个基本错误思路:

如果有s1个长为l1 的前缀,有s2个长为l2的后缀,那么 他们对长为l1+l2 的单词的贡献为 s1*s2

错因:有可能会重复计数

例:

有单词 abc   bcd

那么合法单词abcd 会计算3次:

a+bcd   ab+cd   abc+d

所以对于每个合法的单词,强行规定一个分离位置,来保证一个单词只会被计算一次

规定的分离位置:

若单词长为i的前缀是词典中单词的前缀,长为i+1的前缀不是词典中单词的前缀

那么i就是单词的分离位置

即这个单词是由前面长为i的前缀 和 i后面的后缀 拼接而成

在这个不会算重的思路的基础上

设f[i][j] 表示 原词典单词中 长度为i的前缀,再加1个字母j就不是前缀的 前缀数量

g[i][j] 表示 原词典单词中 长为i的后缀,第1个字母是j的 后缀数量

这两个数组在 正序和倒序 trie树上dfs即可解决

那么长为 i+k 的 前缀后缀 拼接单词数量 = Σ f[i][j]*g[k][j]   j∈[0,26)

但思路仍然还有一个bug:

长为len 的 单词 的所有前缀 都是词典中单词的前缀

例:

词典中单词 cool   o

那么 co 是一个长为2的合法单词

但是co按上述方法找不到分离位置

对于这种单词,我们强制规定 最后两个字母之间为分离位置

注意:这种单词还要满足 不是原词典中的单词,后缀非空 两个条件

所以 设t[i][j] 表示 长为i的前缀,最后一个字母是j 且 不是词典中单词的数量

注意这里不要把长为1的前缀统计进去

如果 g[1][j] 那么 长为i的合法单词 就可以累计 t[i][j]

#include<cstdio>
#include<cstring>
#include<algorithm> #define N 10001
#define L 51 using namespace std; const int mod=1e9+; char s[L]; int ans[]; int f[L][],g[L][],t[L][]; struct TRIE
{
int trie[N*L][],id; int endd[N*L]; void insert(int len)
{
int now=;
for(int i=;i<=len;i++)
{
if(!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++id;
now=trie[now][s[i]-'a'];
}
endd[now]++;
} void dfs(int x,int dep)
{
for(int i=;i<;++i)
{
if(x && !trie[x][i]) f[dep][i]++;
if(x && trie[x][i] && !endd[trie[x][i]]) t[dep+][i]++;
if(trie[x][i]) dfs(trie[x][i],dep+);
}
} void dfs2(int x,int dep)
{
for(int i=;i<;++i)
if(trie[x][i]) g[dep+][i]++,dfs2(trie[x][i],dep+);
} }t1,t2; int main()
{
freopen("word.in","r",stdin);
freopen("word.out","w",stdout);
int n,q,len;
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
len=strlen(s+);
t1.insert(len);
reverse(s+,s+len+);
t2.insert(len);
ans[len]++;
}
t1.dfs(,);
t2.dfs2(,);
for(int i=;i<=;++i)
for(int j=;j<;++j)
if(g[][j]) ans[i]=(ans[i]+t[i][j])%mod;
for(int i=;i<=;++i)
for(int k=;k<=;++k)
for(int j=;j<;++j)
ans[i+k]=(1LL*ans[i+k]+f[i][j]*g[k][j]%mod)%mod;
int x;
while(q--)
{
scanf("%d",&x);
printf("%d\n",ans[x]);
}
}

2017 清北济南考前刷题Day 5 morning的更多相关文章

  1. 2017 清北济南考前刷题Day 7 afternoon

    期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...

  2. 2017 清北济南考前刷题Day 1 afternoon

    期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水 ...

  3. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  4. 2017 清北济南考前刷题Day 3 afternoon

    期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...

  5. 2017 清北济南考前刷题Day 4 afternoon

    期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...

  6. 2017 清北济南考前刷题Day 7 morning

    期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...

  7. 2017 清北济南考前刷题Day 6 afternoon

    期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...

  8. 2017 清北济南考前刷题Day 6 morning

    T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...

  9. 2017 清北济南考前刷题Day 5 afternoon

    期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...

随机推荐

  1. Internet History, Technology and Security (Week5.2)

    Week5 Now, I want to make it real clear that, when I give you a 15 minute video of an amazing invent ...

  2. bootstrap使用总结

    bootstrap是一个webcss框架,集合了html/css/jquery为一家,创建响应式的页面.所谓的响应式就是适配不同的上网设备. 使用bootstrap的步骤: 1.下载bootstrap ...

  3. qq飞车精灵家园里的背景音乐:Mysterious Town pooka 下载

      一直都觉得Mysterious Town pooka特别好听,但是酷狗音乐和网上直接搜搜不到,于是我直接从源文件中找了出来.虽然是.ogg格式,但是在酷狗音乐里还是可以播放的.貌似是<奥丁领 ...

  4. docker 建立私有仓库,24.205为镜像仓库所在主机

    一.下载registry #yum install -y python-devel libevent-devel python-pip gcc xz-devel #python-pip install ...

  5. 反爬虫之JS反编译:PyExecJS

    PyExecJS是python运行JavaScript代码的包 安装: pip install  PyExecJS (或者easy_install PyExecJS) 依赖:  需要有执行JS的程序, ...

  6. css中定位功能的特性

    它有四大特性,页面找不到盒子的情况 1.z-index值表示谁压着谁,数值大的压盖数值小的 2.只有定位了的元素,才有z-index.也就是说,不管相对定位,绝对定位,固定定位,都可以使用z-inde ...

  7. Convolutional Neural Networks卷积神经网络(二)

    转自http://blog.csdn.net/zouxy09/article/details/8781543 CNNs是第一个真正成功训练多层网络结构的学习算法.它利用空间关系减少需要学习的参数数目以 ...

  8. 【bzoj5084】hashit 广义后缀自动机+树链的并+STL-set

    题目描述 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 输入 一行一个字符串Q,表示对S的操作 如果第i个字母是小 ...

  9. Python 变量(下)

    列表 列表是可修改的序列类型.所以列表不可以作为字典的键. >>> a = [1] >>> hash(a) Traceback (most recent call ...

  10. P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...