Codeforces
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的更多相关文章
- 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只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
- CodeForces - 453A Little Pony and Expected Maximum
http://codeforces.com/problemset/problem/453/A 题目大意: 给定一个m面的筛子,求掷n次后,得到的最大的点数的期望 题解 设f[i]表示掷出 <= ...
随机推荐
- 269. Alien Dictionary 另类字典 *HARD*
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- Java EE : 三、图解Session(会话)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.Session由来 二.Sessio ...
- kaggle数据挖掘竞赛初步--Titanic<原始数据分析&缺失值处理>
Titanic是kaggle上的一道just for fun的题,没有奖金,但是数据整洁,拿来练手最好不过啦. 这道题给的数据是泰坦尼克号上的乘客的信息,预测乘客是否幸存.这是个二元分类的机器学习问题 ...
- Mongodb 故障分享 初始化时"errmsg" : "exception: new file allocation failure" 并且长时间处于STARTUP2
Hello,大家下午好. 近几天的项目有点赶,所以耽误了更新.现在给大家分享下,在安装mongodb的过程中,遇到的故障一则.其实很小白的问题,当时遇到这个问题的时候比较心慌,浪费了很多时间,跟大家分 ...
- <context:component-scan>使用说明
Spring组件扫描<context:component-scan/>使用详解 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫 ...
- PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径
总结: 1. include或require包含其他文件 使用./或者 ../,这里的当前路径和上一层路径,取决于运行脚本的路径,会存在如下问题. 在写PHP程序时,经常要用到include或requ ...
- Android版本
Android自从3.0版本开始引入了Fragment的概念,它可以让界面在平板上更好地展示 Fragment建议继承android.app.Fragment的包,另外support.v4包主要是 ...
- This TableLayout layout or its LinearLayout parent is possibly useless
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 在 Linux 上配置一个 syslog 服务器
syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它. 通过设置一个syslo ...
- koa框架异步返回值的操作(co,koa-compose)
最近在做demo的时候使用了koa框架,自己做了一个静态服务器,首先判断访问文件是否存在,在回调函数中设置了this.body,run之后,各种404,花了N长的时间把koa-compose和co模块 ...