【codeforces #282(div 1)】AB题解
2 seconds
256 megabytes
standard input
standard output
Malek has recently found a treasure map. While he was looking for a treasure he found a locked door. There was a string s written on the door consisting
of characters '(', ')' and '#'.
Below there was a manual on how to open the door. After spending a long time Malek managed to decode the manual and found out that the goal is to replace each '#'
with one or more ')' characters so that the final string becomes beautiful.
Below there was also written that a string is called beautiful if for each i (1 ≤ i ≤ |s|)
there are no more ')' characters than '('
characters among the first i characters of s and
also the total number of '(' characters is equal to the total number of ')'
characters.
Help Malek open the door by telling him for each '#' character how many ')'
characters he must replace it with.
The first line of the input contains a string s (1 ≤ |s| ≤ 105).
Each character of this string is one of the characters '(', ')'
or '#'. It is guaranteed that s contains
at least one '#' character.
If there is no way of replacing '#' characters which leads to a beautiful string print - 1.
Otherwise for each character '#' print a separate line containing a positive integer, the number of ')'
characters this character must be replaced with.
If there are several possible answers, you may output any of them.
(((#)((#)
1
2
()((#((#(#()
2
2
1
#
-1
(#)
-1
贪心。
(表示1,)表示-1。
满足条件则前缀和时刻都要>=0。
那么遇到#我们仅仅让他表示一个)。前缀和仅仅-1。遇到最后一个#再把前面的债还清。
一開始WA了,由于我遇到最后一个#就无论前缀和了。
。
因此(#(这种数据就过不了。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#define M 100000+5
using namespace std;
char s[M];
int ans[M];
int main()
{
scanf("%s",s);
int l=strlen(s);
int la,now=0,tot=0;
for (int i=0;i<l;i++)
{
if (s[i]=='#')
{
ans[++tot]=1;
now--;
la=i;
}
if (s[i]=='(') now++;
if (s[i]==')') now--;
if (now<0)
{
puts("-1");
return 0;
}
}
int x=0;
for (int i=l-1;i>la;i--)
{
if (s[i]=='(')
x--;
else x++;
if (x<0)
{
puts("-1");
return 0;
}
}
ans[tot]+=now;
for (int i=1;i<=tot;i++)
printf("%d\n",ans[i]);
return 0;
}
2 seconds
256 megabytes
standard input
standard output
Hamed has recently found a string t and suddenly became quite fond of it. He spent several days trying to find all occurrences of t in
other strings he had. Finally he became tired and started thinking about the following problem. Given a string s how many ways are there to extract k ≥ 1 non-overlapping
substrings from it such that each of them contains string t as a substring? More formally, you need to calculate the number of ways to choose two sequences a1, a2, ..., ak and b1, b2, ..., bk satisfying
the following requirements:
- k ≥ 1



t is
a substring of string saisai + 1... sbi (string s is
considered as 1-indexed).
As the number of ways can be rather large print it modulo 109 + 7.
Input consists of two lines containing strings s and t (1 ≤ |s|, |t| ≤ 105).
Each string consists of lowercase Latin letters.
Print the answer in a single line.
ababa
aba
5
welcometoroundtwohundredandeightytwo
d
274201
ddd
d
12
kmp+dp。
首先用kmp高速求出每一位的ok[i],也就是从i到ok[i]包括t,且ok[i]最小。
然后进行dp:
f[i]表示a[1]=i的方案数。这显然要倒着做。
f[i]=sigma(sigma(f[ok[i]+1...n-1)+sigma(f[ok[i]+2...n-1]...+f[n-1]))
维护后缀和sum[i]表示i到n-1的f值得后缀和。
再维护后缀和的后缀和ss[i]表示i到n-1的sum[i]的后缀和。
于是f[i]=ss[ok[i]+1],转移变成O(1)了!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define mod 1000000007
#define M 100000+5
using namespace std;
int ss[M],ne[M],n,m,ok[M],sum[M],f[M];
char s[M],t[M];
void Getfail()
{
ne[0]=0;
ne[1]=0;
for (int i=1;i<m;i++)
{
int j=ne[i];
while (j&&t[i]!=t[j])
j=ne[j];
ne[i+1]=t[i]==t[j]? j+1:0;
}
}
void Find()
{
Getfail();
int j=0;
int now=0;
for (int i=0;i<n;i++)
ok[i]=n;
for (int i=0;i<n;i++)
{
while (j&&t[j]!=s[i])
j=ne[j];
if (t[j]==s[i])
j++;
if (j==m)
{
for (int k=now;k<=i-m+1;k++)
ok[k]=min(i,ok[k]);
now=i-m+2;
j=ne[j];
}
}
}
int main()
{
scanf("%s",s);
scanf("%s",t);
n=strlen(s),m=strlen(t);
Find();
for (int i=n-1;i>=0;i--)
{
f[i]=n-1-(ok[i]-1);
f[i]=(f[i]+ss[ok[i]+1])%mod;
sum[i]=(sum[i+1]+f[i])%mod;
ss[i]=(ss[i+1]+sum[i])%mod;
}
cout<<sum[0]%mod<<endl;
return 0;
}
【codeforces #282(div 1)】AB题解的更多相关文章
- Codeforces #282 div 1 C Helping People 题解
CF 282 C Helping People 题解 [原题] time limit per test 2 seconds memory limit per test 512 megabytes in ...
- [Codeforces] #603 (Div. 2) A-E题解
[Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...
- # Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
- Codeforces Round #557 (Div. 1) 简要题解
Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...
- Codeforces #344 Div.2
Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...
- Codeforces #345 Div.1
Codeforces #345 Div.1 打CF有助于提高做题的正确率. Watchmen 题目描述:求欧拉距离等于曼哈顿距离的点对个数. solution 签到题,其实就是求有多少对点在同一行或同 ...
- Codeforces Beta Round #27 (Codeforces format, Div. 2)
Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...
- Codeforces#441 Div.2 四小题
Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...
- codeforces #592(Div.2)
codeforces #592(Div.2) A Pens and Pencils Tomorrow is a difficult day for Polycarp: he has to attend ...
随机推荐
- [ Python - 11 ] 多线程及GIL全局锁
1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境 ...
- Flex slider参数详细
$(window).load(function() { $('.flexslider').flexslider({ animation: "fade", //String: Sel ...
- 磁盘挂载MOUNT 445问题集
挂载磁盘mount -t cifs -o username="Administrator",password="123@qq" //192.168.100.4/ ...
- Nessus home与Nexpose community 对比
转载请注明来源:http://www.cnblogs.com/phoenix--/p/3345569.html 更新:Nessus home版限制了,总量:16,Nexpose限制了总量为32,全部没 ...
- SPFA解决单源最短路径
SPFA(Shortest Path Faster Algorithm): 一:基本算法 在求解单源最短路径的时候,最经典的是 Dijkstra 算法,但是这个算法对于含有负权的图就无能为力了,而 B ...
- Lock wait timeout exceeded数据库死锁问题
环境 MySQL5.5 现象 A.数据更新或新增后数据经常自动回滚. B.表操作总报 Lock wait timeout exceeded 并长时间无反应 解决方法 A.应急方法:show proce ...
- Android学习--还有一些小技巧
这些小技巧 通过上面的这些文章,就把简单的安卓项目总结了一遍,当然你说懂这些就可以做Android开发的话还是不行的,欠缺的还有很多,但欠缺的这些我们有只能在工作中去总结以及不断的提高,这篇文章我们还 ...
- hadoop遇到的问题(汇总)
1. 如果Map和reduce的输出不一致,需要显示的设置Map的输出,没有根据参数进行推导的原因是类型擦除 combiner是在copy数据到机器之前可以进行的一些数据的合并,这和数据有关,不是所有 ...
- JavaScript中的局部作用域及常量的定义
局部作用域 通常JavaScript的作用域是函数内部,在类似for循环的语句块中是无法申明局部变量的. function exm() { for (var i=0; i<100; i++) { ...
- 浅谈Java中final,finalized,finally
final: final可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一. fi ...