A. Treasure
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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.

Output

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.

Sample test(s)
input
(((#)((#)
output
1
2
input
()((#((#(#()
output
2
2
1
input
#
output
-1
input
(#)
output
-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;
}

B. Obsessive String
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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

Input consists of two lines containing strings s and t (1 ≤ |s|, |t| ≤ 105).
Each string consists of lowercase Latin letters.

Output

Print the answer in a single line.

Sample test(s)
input
ababa
aba
output
5
input
welcometoroundtwohundredandeightytwo
d
output
274201
input
ddd
d
output
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题解的更多相关文章

  1. 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 ...

  2. [Codeforces] #603 (Div. 2) A-E题解

    [Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...

  3. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  4. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  5. Codeforces #344 Div.2

    Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...

  6. Codeforces #345 Div.1

    Codeforces #345 Div.1 打CF有助于提高做题的正确率. Watchmen 题目描述:求欧拉距离等于曼哈顿距离的点对个数. solution 签到题,其实就是求有多少对点在同一行或同 ...

  7. Codeforces Beta Round #27 (Codeforces format, Div. 2)

    Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...

  8. Codeforces#441 Div.2 四小题

    Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...

  9. codeforces #592(Div.2)

    codeforces #592(Div.2) A Pens and Pencils Tomorrow is a difficult day for Polycarp: he has to attend ...

随机推荐

  1. django配置使用redis

    通常redis都是用来保存session.短信验证码.图片验证码等数据. 在django上使用redis,先要安装一个包: pip install django-redis==4.8.0(我用的dja ...

  2. mySQL的存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  3. [loj#115] 无源汇有上下界可行流 网络流

    #115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题 ...

  4. DB2、ORACLE SQL写法的主要区别

    DB2.ORACLE SQL写法的主要区别   说实话,ORACLE把国内的程序员惯坏了,代码中的SQL充斥着大量ORACLE特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了ORACL ...

  5. 【转-记】mysql总结

    1 | 查询所有数据  select * from Info 查所有数据 select Code,Name from Info 查特定列    2 | 根据条件查  select * from Inf ...

  6. [thinkphp] ajaxReturn案例

    javascript: <script> $('.ajax-post').click(function(){ var action_url=$('form').attr('action') ...

  7. HDU 2473 Junk-Mail Filter 【并查集删除】

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现

    散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...

  9. ubuntu 修改权限

    在linux终端先输入ll,可以看到如: -rwx-r–r– (一共10个参数) 表示文件所属组和用户的对应权限. 第一个跟参数属于管理员,跟chmod无关,先不管. 2-4参数:属于user 5-7 ...

  10. [BZOJ 2342] 双倍回文

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 Algorithm: 解决回文串问题,一般从对称轴下手. 肯定先跑一边Manach ...