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的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. Js自学学习-笔记6-8

    <!-- 第6-7课笔记 --> <!-- for循环 for(条件1:判断:变化)其实就是if嵌套 while do for循环简化版 可以用do while swith case ...

  2. ThinkPHP项目怎么运行?

    1.下载ThinkPHP项目 2.安装核心框架framework 3.配置集成开发环境:wamp或者xampp或者phpStudy

  3. 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼

    离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...

  4. mysql:explain分析sql

    对于执行较慢的sql,可以使用explain命令查看这些sql的执行计划.查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看 mysql> explain ...

  5. restful规范和drf模块

    restfu1规范 它是一个规范,面向资源架构 10条规范: 1.api与用户的通信协议,总是使用https协议 api网上提供的接口 2.域名: 尽量将api部署在专用域名(会存在跨域问题) API ...

  6. python 列表(增删改查)

    列表 :(列表可以嵌套,列表的中的元素可以为任意) 列表的创建:1.   a = [1, 2, 3] 2.   a = list([1, 2, 3]) 1.查: 索引(下标),都是从0开始 切片 .c ...

  7. Android自动化测试Uiautomator--UiScrollable接口简介

    UiScrollable主要包括以下几个方面的方法: 1.快速滚动 2.获取列表子元素 3.获取与设置最大滚动次数常量值 4.滑动区域校准常量设置与获取 5.先前与向后滚动 6.滚动到某个对象 7.设 ...

  8. getParameter getAttribute

    URL:http://localhost:8888/Test/index.jsp?test=123 <body> ${test} ${requestScope.test} <%req ...

  9. docker+Battery Historian 环境搭建(电量分析)

    docker 安装(windows) 1.  下载 https://docs.docker.com/docker-for-windows/install/  和 安装和添加环境变量(...) 2. 安 ...

  10. luogu1879 [USACO06NOV]玉米田Corn Fields

    学习位运算 #include <iostream> #include <cstdio> using namespace std; int n, m, dp[15][4105], ...