【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 ...
随机推荐
- django配置使用redis
通常redis都是用来保存session.短信验证码.图片验证码等数据. 在django上使用redis,先要安装一个包: pip install django-redis==4.8.0(我用的dja ...
- mySQL的存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- [loj#115] 无源汇有上下界可行流 网络流
#115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题 ...
- DB2、ORACLE SQL写法的主要区别
DB2.ORACLE SQL写法的主要区别 说实话,ORACLE把国内的程序员惯坏了,代码中的SQL充斥着大量ORACLE特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了ORACL ...
- 【转-记】mysql总结
1 | 查询所有数据 select * from Info 查所有数据 select Code,Name from Info 查特定列 2 | 根据条件查 select * from Inf ...
- [thinkphp] ajaxReturn案例
javascript: <script> $('.ajax-post').click(function(){ var action_url=$('form').attr('action') ...
- HDU 2473 Junk-Mail Filter 【并查集删除】
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现
散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...
- ubuntu 修改权限
在linux终端先输入ll,可以看到如: -rwx-r–r– (一共10个参数) 表示文件所属组和用户的对应权限. 第一个跟参数属于管理员,跟chmod无关,先不管. 2-4参数:属于user 5-7 ...
- [BZOJ 2342] 双倍回文
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 Algorithm: 解决回文串问题,一般从对称轴下手. 肯定先跑一边Manach ...