Codeforces 7E

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
map<string,int> Map;
int KASE;
string Str,t;
char Tmp[];
inline int Get(int l,int r)
{
int L,R,B=;
for (int i=r-;i>=l;i--)
{
B+=(t[i]=='(')-(t[i]==')');
if (!B && (t[i]=='+' || t[i]=='-'))
{
L=Get(l,i),R=Get(i+,r);
return L && R && (t[i]=='+' || R>);
}
}
for (int i=r-;i>=l;i--)
{
B+=(t[i]=='(')-(t[i]==')');
if (!B && (t[i]=='*' || t[i]=='/'))
{
L=Get(l,i),R=Get(i+,r);
return L> && R> && (t[i]=='*' || R==)?:;
}
}
if (t[l]=='(') return Get(l+,r-)?:;
string x=t.substr(l,r-l);
return Map.count(x)?Map[x]:;
}
inline int Work()
{
gets(Tmp);
int Len=strlen(Tmp); t="";
for (int i=;i<Len;i++) if (Tmp[i]!=' ') t+=Tmp[i];
return Get(,t.size());
}
int main()
{
scanf("%d",&KASE);
for (int Kase=;Kase<=KASE;Kase++)
{
scanf(" #%*s"),cin>> Str;
Map[Str]=Work();
}
puts(Work()?"OK":"Suspicious");
return ;
}

C++

我们考虑一个宏是否是“安全”的,经过观察和一些实验,可以发现,只有以下4种状态:

• 状态1(s1): 这个宏完全安全,以任何方式使用该宏都没问题。

• 状态2(s2): 这个宏不安全,只要表达式中出现该宏,都会导致表达式不安全。

• 状态3(s3): 这个宏部分安全,仅当这个宏与’*’,’/’连接时,或出现在’-’后面时,才会使 表达式不安全。

• 状态4(s4): 这个宏部分安全,仅当这个宏出现在’/’后面时,才会使表达式不安全。

有了这4个状态,我们只需推出状态之间的转移即可。

• 如果表达式没有使用任何运算符或括号或宏(也就是s仅仅是个单独的变量),那么安 全级别显然是s1

• 如果表达式s是(t)的形式(被一对括号括起来的表达式t),那么如果t的状态不是s2, 则s的状态是s1,否则s的状态是s2

• 我们找到表达式s中,最后一次运算的符号,设其为op,设其两侧表达式分别为t1和t2。 我们进行以下分类讨论:

– 显然,如果t1或t2的安全状态是s2,则s的状态也是s2;

– 如果op是’+’,那么s的状态是s3; – 如果op是’-’,那么,如t2状态是s3,则s状态是s2,否则s状态是s3

– 如果op是’*’,那么,如t1或t2状态是s3,则s状态是s2,否则s状态是s4

– 如果op是’/’,那么,如t1或t2状态是s3,或t2状态是s4,则s状态是s2,否则s状态是s4

于是,此题得到了解决。 时间复杂度O(n∗len2),如果愿意追求更好的复杂度,可以建 出表达式树,从而做到O(N ∗len)

Codeforces 17C

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int F[][][][],Pos[];
int Next[][],n,Ans=;
char Str[];
const int Mod=;
inline int Abs(int x) {return x>?x:-x;}
int main()
{
scanf("%d",&n); int m=n/+;
scanf("%s",Str+);
for (int i=n;i>=;i--)
{
Pos[Str[i]]=i;
for (int j=;j<=;j++) Next[i][j]=Pos[j+'a'-];
}
F[][][][]=;
for (int i=;i<=n;i++)
{
for (int a=;a<=m;a++)
for (int b=;b<=m;b++)
for (int c=;c<=m;c++)
{
if (!F[i][a][b][c]) continue;
if (a+b+c==n && Abs(a-b)<= && Abs(a-c)<= && Abs(b-c)<=) Ans=(Ans+F[i][a][b][c])%Mod;
F[Next[i][]][a+][b][c]=(F[Next[i][]][a+][b][c]+F[i][a][b][c])%Mod;
F[Next[i][]][a][b+][c]=(F[Next[i][]][a][b+][c]+F[i][a][b][c])%Mod;
F[Next[i][]][a][b][c+]=(F[Next[i][]][a][b][c+]+F[i][a][b][c])%Mod;
}
}
printf("%d\n",Ans);
return ;
}

C++

一段连续的字母必定对应原 串的某个字符, 原串的某个字符也必定对应可以得到的串中一段连续的字母。Dp就可以了。

Codeforces 17E

 #include <cstdio>
#define LL long long
using namespace std;
const LL Maxn=;
const LL Mod=;
char Str[Maxn],S[Maxn];
LL P[Maxn],n,a[Maxn],b[Maxn],Ans=;
inline LL Min(LL x,LL y) {return x>y?y:x;}
inline void Manacher()
{
Str[]='$'; Str[]='#'; Str[(n<<)+]='^';
for (LL i=;i<=n;i++) Str[i<<]=S[i],Str[i<<|]='#';
LL Mx=,Id=; n=n<<|;
for (LL i=;i<=n;i++)
{
if (i<Mx) P[i]=Min(Mx-i,P[*Id-i]); else P[i]=;
while (Str[i-P[i]]==Str[i+P[i]]) P[i]++;
if (P[i]+i>Mx) Mx=P[i]+i,Id=i;
}
}
int main()
{
scanf("%I64d",&n); LL nn=n;
scanf("%s",S+);
Manacher();
for (LL i=;i<=n+;i++) a[(i-P[i])/+]++,a[i/+]--,b[(i+)/]++,b[(i+P[i])/]--,Ans+=P[i]/;
for (LL i=;i<=n;i++) a[i]+=a[i-],b[i]+=b[i-];
Ans%=Mod; Ans=(Ans*(Ans-))/%Mod;
for (LL i=;i<=nn;i++) (b[i]+=b[i-])%Mod,Ans=(Ans-a[i]*b[i-])%Mod;
printf("%I64d\n",(Ans+Mod)%Mod);
return ;
}

C++

可以用Manacher算出每个字符为中心的回文串的最大长度。相交的对数=总的对数-不相交的对数, 那窝萌统计不想交的对数。

sum[i]表示右边界小于等于i的回文串个数,cnt[i]表示左边界等于i的回文串个数。那么就是∑sum[i]*cnt[i+1]

那么如何统计cnt[i]呢,求出Manacher求出P[i]以后,从左边界加一右边界减一从左往右加即可.

sum[i]就是再次从往右加即可.

Codeforce 23E

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=;
struct EDGE{int to,next;}edge[Maxn<<];
int head[Maxn],n,u,v,F[Maxn][Maxn],cnt,Size[Maxn];
inline int Max(int x,int y) {return x>y?x:y;}
inline void Add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
void Dfs(int u,int fa)
{
Size[u]=;
for (int i=;i<=n;i++) F[u][i]=;
for (int i=head[u];i!=-;i=edge[i].next)
{
if (edge[i].to==fa) continue;
Dfs(edge[i].to,u);
for (int j=Size[u];j;j--)
{
for (int k=;k<=Size[edge[i].to];k++)
{
int x=F[u][j]*F[edge[i].to][k];
F[u][j+k]=Max(F[u][j+k],x);
}
F[u][j]=F[u][j]*F[edge[i].to][];
}
Size[u]+=Size[edge[i].to];
}
for (int i=;i<=Size[u];i++)
{
int x=F[u][i]*i;
F[u][]=Max(F[u][],x);
}
}
int main()
{
scanf("%d",&n);
memset(head,-,sizeof(head));
for (int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
Add(u,v),Add(v,u);
}
Dfs(,);
printf("%d\n",F[][]);
return ;
}

C++

需要高精度.

用F[i][s]表示考虑以i为根的子树,且i所属的连通块大小是s时的最大值

转移:对于i的每个孩子j,枚举k,用dp[j][k]∗dp[i][s]去更新dp[i][s+k]即可.

Codeforces的更多相关文章

  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只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

  10. CodeForces - 453A Little Pony and Expected Maximum

    http://codeforces.com/problemset/problem/453/A 题目大意: 给定一个m面的筛子,求掷n次后,得到的最大的点数的期望 题解 设f[i]表示掷出 <= ...

随机推荐

  1. sass1:

    less在处理CSS动画时,非常恶心,决定转向sass了.sass诞生得比less早,只是因为它是ruby写的,因此受众面够少.但我们不需要自己下编译器或使用命令行,我们可以koala这神器 首先几个 ...

  2. Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?

    Joomla 软件功能介绍:    Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...

  3. jfinal基本应用 --报主键重复

    在使用jfinal 的Model过程中有一个很怪异的问题,发布到服务器上,只要是往表中添加字段,就报主键重复. 1.我添加表的时候调用了 public void create(Map map){ St ...

  4. MySql学习(五) —— 数据库优化理论篇(一)

    一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...

  5. Tableau修改参考线上显示的标签

    修改Tableau中参考线上的标签显示内容,如下图所示:可根据自定义调整

  6. js面向对象的使用方法

    标准用法: function Sprite(){ //函数内容部设置属性 this.name='shimily'; } //原型上设置方法 Sprite.prototype.show=function ...

  7. !important使用

    IE 6.0一直都不支持这个语法,而其他的浏览器都支持.因此我们就可以利用这一点来分别 给IE和其他浏览器不同的样式定义,例如,我们定义这样一个样式: colortest {border:20px s ...

  8. Xcode相关整理

    阅读目录 javadoc格式文档注释插件 xcodekit插件 常用快捷键 XCode中快捷健字符与MAC键盘对应关系: 添加自动生成格式为javadoc文档注释的插件VVDocumenter 首先推 ...

  9. RPM

    1.安装RPM 使用-ivh选项即可,能查看安装信息和进度. 例如: #RPM -ivh XXX.rpm RPM升级与更新,使用-Uvh选项或者-Fvh选项,两者略有区别. -Uvh选项:后面接的软件 ...

  10. JS数组常用函数以及查找数组中是否有重复元素的三种常用方法

    阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法  1. var ary = new Array(&qu ...