codeforces edu40
H(dp计数)
题意:
有一颗树,最深的点的深度是n,每个深度为i的点都有ai个孩子。
对于1<=k<=2n-2,回答树上有多少点对之间的距离是k,答案对1e9+7取模
n<=5000,ai<=1e9
分析:
考虑在lca处计数,发现时间复杂度是O(n^3),即使用卷积优化也仍旧是O(n^2logn)的,无法通过n=5000的情况
考虑另一种计数方式,在端点处计数,分为两种,一种是down,一种是up,down就比较好处理,至于up考虑根据上一个深度来dp
考虑up的时候只有两种决策,一种是挂一个下来,另一种是在当前深度的上一个进行转弯,分别计数即可
时间复杂度O(n^2)
G(FFT+dsu)
题意:
我们定义两个等长字符串x和y的距离就是将最少的字母让另一种字母替代,使得x=y
现在给出两个字符串S,T,|S|>=|T|,问S的所有长度为T的子串,每个子串和T的距离分别是多少,都要输出
|S|<=125000
字符集只有abcdef
分析:
考虑如何求两个等长字符串的距离,我们只需要给对应字母建个无向图,答案就是点数-连通块个数
因为字符集很小,只有abcdef,所以连边情况只有36种,可以状态压缩
我们可以枚举s中的某个字母a,t中的某个字母b,看看有哪些位置的S子串会被这个(a,b)贡献到
这个东西可以用卷积来实现
把s中a的对应位置抠出来赋值为1,其它为0,把t中b的对应位置抠出来赋值为1,其它为0,两个多项式卷积一下就行了
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5;
const double pi=acos(-1.0);
char t[maxn+],s[maxn+];
int id[][];
pair<int,int> index[];
long long state[maxn+];
int n,m;
struct wjmzbmr
{
double r,i;
wjmzbmr(double real=0.0,double image=0.0){r=real;i=image;}
wjmzbmr operator + (const wjmzbmr o)
{
return wjmzbmr(r+o.r,i+o.i);
}
wjmzbmr operator - (const wjmzbmr o)
{
return wjmzbmr(r-o.r,i-o.i);
}
wjmzbmr operator * (const wjmzbmr o)
{
return wjmzbmr(r*o.r-i*o.i,r*o.i+i*o.r);
}
};
wjmzbmr x1[maxn+],x2[maxn+];
void brc(wjmzbmr *y,int l)
{
for(int i=,j=l/;i<l-;i++)
{
if(i<j) swap(y[i],y[j]);
int k=l/;
while(j>=k)j-=k,k/=;
if(j<k) j+=k;
}
}
void fft(wjmzbmr *y,int l,double on)
{
wjmzbmr u,t;
brc(y,l);
for(int h=;h<=l;h<<=)
{
wjmzbmr wn(cos(on**pi/h),sin(on**pi/h));
for(int j=;j<l;j+=h)
{
wjmzbmr w(,);
for(int k=j;k<j+h/;k++)
{
u=y[k];
t=w*y[k+h/];
y[k]=u+t;
y[k+h/]=u-t;
w=w*wn;
}
}
}
if(on==-)for(int i=;i<l;i++) y[i].r/=l;
}
void work(int x,int y)
{
int len=;
while(len<n+m) len<<=;
for(int i=;i<=len;++i) x1[i].r=x1[i].i=x2[i].i=x2[i].r=0.0;
for(int i=;i<n;++i) if(s[i]==x+'a') x1[i].r=;
for(int i=;i<m;++i) if(t[i]==y+'a') x2[i].r=;
reverse(x2,x2+m);
fft(x1,len,);
fft(x2,len,);
for(int i=;i<len;++i) x1[i]=x1[i]*x2[i];
fft(x1,len,-);
for(int i=;i<n;++i)
if((int)(x1[i+m-].r+0.5)>) state[i]|=(1LL<<id[x][y]);
}
int f[];
int find(int x)
{
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
void uni(int x,int y)
{
int u=find(x),v=find(y);
if(u==v) return ;
f[u]=v;
}
int cal(long long s)
{
for(int i=;i<;++i) f[i]=i;
for(int i=;i<;++i)
if(s&(1LL<<i))
{
int u=index[i].first,v=index[i].second;
uni(u,v);
}
int ans=;
for(int i=;i<;++i)
if(f[i]==i) --ans;
return ans;
}
int main()
{
scanf("%s%s",s,t);
n=strlen(s),m=strlen(t);
int sz=;
for(int i=;i<;++i)
for(int j=;j<;++j)
{
id[i][j]=sz;
index[sz]=make_pair(i,j);
++sz;
}
for(int i=;i<;++i)
for(int j=;j<;++j)
if(i!=j)
work(i,j);
for(int i=;i<=n-m;++i)
printf("%d ",cal(state[i]));
return ;
}
codeforces edu40的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- A*和IDA*介绍
\(A*\)算法是一种很神奇的搜索方法,它属于启发式搜索中的一种.A*最主要的功能当然就是用来剪枝,提高搜索的效率.A*主要的实现方法是通过一个估价函数,每次对下一步进行一个估价,根据估价出的值来决定 ...
- 更新portage之后 安装 certbot
运行的时候一直报如下的错误: sudo certbot 错误结果: Traceback (most recent call last): File "/usr/lib/python-exec ...
- js之数组知识
一.数组的定义(来源于Array.prototype) 1.构造函数方法: (1)var arr = new Array();//没有参数等价于 var arr = []; (2)var arr = ...
- PAT 乙级 1019
题目 题目地址:PAT 乙级 1019 思路 本题没有考虑到小于1000的情况,当小于1000的时需要给vector的向量中推入0,直到向量中有四位数字,之后再进行排序并进行相关计算 代码 #incl ...
- centos7系统root无法通过su切换到某个普通用户
[root@test ~]# su webappsu: failed to execute /bin/bash: Resource temporarily unavailable [root@test ...
- rz
Linux系统简单易用的上传下载命令rz和sz sudo yum install lrzsz -y 上传:rz 下载:sz
- python项目开发视频
精品Python项目开发学习视频 所属网站分类: 资源下载 > python视频教程 作者:乐天派 链接:http://www.pythonheidong.com/blog/article/44 ...
- java 之Thread线程相关yield()、sleep()、wait()、join()、run和start方法详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- 一丶Python模块之getpass模块
Python模块之getpass模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. getpass模块提供了可移 ...
- 【工具】Homebrew的安装及使用
Homebrew官网:http://brew.sh/index_zh-cn.html Homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于linux下的a ...