Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp
题目链接:
题目
A. Reberland Linguistics
time limit per test:1 second
memory limit per test:256 megabytes
问题描述
First-rate specialists graduate from Berland State Institute of Peace and Friendship. You are one of the most talented students in this university. The education is not easy because you need to have fundamental knowledge in different areas, which sometimes are not related to each other.
For example, you should know linguistics very well. You learn a structure of Reberland language as foreign language. In this language words are constructed according to the following rules. First you need to choose the "root" of the word — some string which has more than 4 letters. Then several strings with the length 2 or 3 symbols are appended to this word. The only restriction — it is not allowed to append the same string twice in a row. All these strings are considered to be suffixes of the word (this time we use word "suffix" to describe a morpheme but not the few last characters of the string as you may used to).
Here is one exercise that you have found in your task list. You are given the word s. Find all distinct strings with the length 2 or 3, which can be suffixes of this word according to the word constructing rules in Reberland language.
Two strings are considered distinct if they have different length or there is a position in which corresponding characters do not match.
Let's look at the example: the word abacabaca is given. This word can be obtained in the following ways: , where the root of the word is overlined, and suffixes are marked by "corners". Thus, the set of possible suffixes for this word is {aca, ba, ca}.
输入
The only line contains a string s (5 ≤ |s| ≤ 104) consisting of lowercase English letters.
输出
On the first line print integer k — a number of distinct possible suffixes. On the next k lines print suffixes.
Print suffixes in lexicographical (alphabetical) order.
样例
input
abacabaca
output
3
aca
ba
ca
题意
英语渣orz不知道“twice in a row”是指连续两个的意思。。
先把串的开头5个去掉,把剩下的分割为长度为2,3的若干个子串,并且任何相邻的子串不能相同,问最后能形成的所有合法的不同子串。
题解
dp[i][0]表示以i结尾的长度为2的子串是否能分割出来。
dp[i][1]表示以i结尾的长度为3的子串是否能分割出来。
则有状态转移:
dp[i][0]=dp[i-2][1]||dp[i-2][0]&&(str[i]!=str[i-2]||str[i-1]!=str[i-3])
dp[i][1]类似上面的转移。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
const int maxn = 1e4 + 10;
string str;
int n;
bool dp[maxn][2];
int main() {
cin >> str;
n = str.length();
reverse(str.begin(),str.end());
memset(dp, 0, sizeof(dp));
if(n>=7) dp[1][0] = 1;
if (n >= 8) dp[2][1] = 1;
for (int i = 3; i < n - 5; i++) {
if (dp[i - 2][1]) {
dp[i][0] = 1;
}
if (dp[i - 2][0] && !(str[i] == str[i - 2] && str[i - 1] == str[i - 3])) {
dp[i][0] = 1;
}
if (dp[i - 3][0]) {
dp[i][1] = 1;
}
if (dp[i - 3][1] && !(str[i] == str[i - 3] && str[i - 1] == str[i - 4] && str[i - 2] == str[i - 5])) {
dp[i][1] = 1;
}
}
vector<string> ans;
string s;
for (int i = 0; i < n - 5; i++) {
if (dp[i][0]) {
s = ""; s += str[i]; s += str[i - 1];
ans.push_back(s);
}
if (dp[i][1]) {
s = ""; s += str[i]; s += str[i - 1]; s += str[i - 2];
ans.push_back(s);
}
}
sort(ans.begin(), ans.end());
ans.erase(unique(ans.begin(), ans.end()),ans.end());
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << endl;
}
return 0;
}
Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp的更多相关文章
- Codeforces Round #349 (Div. 2) C. Reberland Linguistics DP+set
C. Reberland Linguistics First-rate specialists graduate from Berland State Institute of Peace a ...
- Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划
A. Reberland Linguistics 题目连接: http://www.codeforces.com/contest/666/problem/A Description First-rat ...
- Codeforces Round #349 (Div. 2) C. Reberland Linguistics (DP)
C. Reberland Linguistics time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #349 (Div. 1) B. World Tour 最短路+暴力枚举
题目链接: http://www.codeforces.com/contest/666/problem/B 题意: 给你n个城市,m条单向边,求通过最短路径访问四个不同的点能获得的最大距离,答案输出一 ...
- Codeforces Round #349 (Div. 2) D. World Tour (最短路)
题目链接:http://codeforces.com/contest/667/problem/D 给你一个有向图,dis[i][j]表示i到j的最短路,让你求dis[u][i] + dis[i][j] ...
- Codeforces Round #349 (Div. 1) B. World Tour 暴力最短路
B. World Tour 题目连接: http://www.codeforces.com/contest/666/problem/B Description A famous sculptor Ci ...
- Codeforces Round #349 (Div. 1)E. Forensic Examination
题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含\(s_l-s_r\)子串的最大数量是多少 题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示\(s ...
- Codeforces Round #349 (Div. 2)
第一题直接算就行了为了追求手速忘了输出yes导致wa了一发... 第二题技巧题,直接sort,然后把最大的和其他的相减就是构成一条直线,为了满足条件就+1 #include<map> #i ...
随机推荐
- Google Play支付校验
关于Google Play支付校验我之前在网上也找过大量的相关资料,发现大多数都是采用publicKey的方式来校验订单,但是在Google Play提供的官方实例中publicKey其实在客户端也是 ...
- dateset是不是在缓存中
C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...
- android 网络_网络源码查看器
xml设计 <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" ...
- 【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转
//绕着与axis平行的任意轴旋转 void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 ...
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- SP避免Form重复提交的三种方案
SP避免Form重复提交的三种方案 1) javascript ,设置一个变量,只允许提交一次. <script language="javascript"> ...
- 6.struts登陆页面的演示
1.创建一个web project "Struts_1" 添加struts的jar包 --在项目文件右键->myeclipse->add struts... ...
- 数字图象处理MATLAB学习
diagram = imread('C:\Users\Administrator\Desktop\Compressed\fiter\lena256.jpg') %diagram = rgb2gray( ...
- java 反射的踩的一个坑
今天工作的时候用到了一个反射.其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法.完成一定的定时任务. 写到的方法 ...
- string和json转换的简单应用
import com.alibaba.fastjson.JSON; String strjson = request.getParameter("param"); //url-js ...