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. ExtJs 之 ComboBox级联使用

    刚接触ExtJs不到一周,项目使用ExtJs框架,有个版块用到了combobox的级联(两级),遇到了一系列的问题,两天来一直查API.网络资料,终于解决了. 先列出遇到的一系列问题(也许你也遇到过! ...

  2. ElasticSearch部署安装

    测试版本:elasticsearch-5.1.1 1.Windows环境下安装(win10系统) 1)解压elasticsearch-5.1.1.zip. 2)执行elasticsearch.bat启 ...

  3. java selenium (三) 环境搭建 基于Maven

    现在Java的大部分项目都是基于Maven,  在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...

  4. PHP 通过Socket收发16进制数据

    最近在php下做关于Socket通讯的相关内容,发现网络上好多人在了解如何进行16进制收发,研究了下,代码如下,欢迎拍砖. <?php        $sendStr = '30 32 30 3 ...

  5. 怎么把Windows主机上的目录共享到Ubuntu上

    使用Oracle VM VirtualBox在Windows主机上创建了一台Ubuntu虚拟机,怎么把宿主机上的目录共享到Ubuntu上,可使用以下方法: eg.把Windows主机上D盘里的test ...

  6. ios新特性(泛型)

    协变 子类转父类   逆变父类给子类赋值

  7. JavaWeb chapter10 JavaWeb开发模式

    1.  开发模式 (1)开发模式1:JSP+JavaBean (2)开发模式2:Servlet+JSP+JavaBean (MVC) 2.JavaBean 本质上是一个普通的Java类:需要遵循一定的 ...

  8. Labview调用Python脚本

    Labview程序框图如下: Python脚本如下: #!/usr/bin/env pythonimport sys #Command Line Arguements are stored in li ...

  9. 计算机网络(10)-----TCP的拥塞控制

    TCP的拥塞控制 拥塞(congestion) 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏. 拥塞控制 拥塞控制就是防止过多的数据注入到网络中,这样可以使网 ...

  10. @autoreleasepool在MRC和ARC中的区别

    对于@autoreleasepool {} (1)在ARC中会销毁所有在里面创建的对象,即使你用外面的Strong指针指向他 (2)在MRC中如果有外部的强指针指向,不会销毁对象,retainCoun ...