ZOJ 3810 Pretty Poem 分类: ACM 2015-05-17 14:40 83人阅读 评论(0) 收藏
Pretty Poem
Time Limit: 2 Seconds Memory Limit:65536 KB
Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are many famous poets in the contemporary era. It is said that a few ACM-ICPC contestants can even write poetic code. Some poems has
a strict rhyme scheme like "ABABA" or "ABABCAB". For example, "niconiconi" is composed of a rhyme scheme "ABABA" with A = "ni" and B = "co".
More technically, we call a poem pretty if it can be decomposed into one of the following rhyme scheme: "ABABA" or "ABABCAB". The symbolA,B and
C are different continuous non-empty substrings of the poem. By the way, punctuation characters should be ignored when considering the rhyme scheme.
You are given a line of poem, please determine whether it is pretty or not.
Input
There are multiple test cases. The first line of input contains an integerT indicating the number of test cases. For each test case:
There is a line of poem S (1 <= length(S) <= 50).S will only contains alphabet characters or punctuation characters.
Output
For each test case, output "Yes" if the poem is pretty, or "No" if not.
Sample Input
3
niconiconi~
pettan,pettan,tsurupettan
wafuwafu
Sample Output
Yes
Yes
No
开始听了LJH的方法把ABABA和ABABCAB 转换成(AB()AB)A和(AB)(AB)(CAB)。就变成了:AA+A的前缀和AA+一个包含A后缀的C结果发现不行,前者还比较好弄,后者没办法把AB分开所以也就不能将A和B相等的情况否定。肯定会将一些AB相等的算作Yes
看了AC的正确代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map> using namespace std; void judge(string str) {
string sa1 , sa2 , sa3 , sb1 , sb2 , sb3 , sc ;
for(int la = 1 ; la < (int)str.length() ; ++la) {
for(int lb = 1 ; lb < (int)str.length() ; ++lb) {
if(3*la + 2*lb == (int)str.length()) {
sa1 = str.substr(0 , la) ;
sa2 = str.substr(la+lb , la) ;
sa3 = str.substr(2*(la+lb) , la) ;
sb1 = str.substr(la , lb) ;
sb2 = str.substr(2*la+lb , lb) ;
if(sa1 == sa2 && sa2 == sa3 && sb1 == sb2 && sa1 != sb1) {
printf("Yes\n") ;
return ;
}
}
if(3*la + 3*lb < (int)str.length()) {
int lc = (int)str.length()-3*la-3*lb ;
sa1 = str.substr(0 , la) ;
sa2 = str.substr(la+lb , la) ;
sa3 = str.substr(2*la+2*lb+lc , la) ;
sb1 = str.substr(la , lb) ;
sb2 = str.substr(2*la+lb , lb) ;
sb3 = str.substr(3*la+2*lb+lc , lb) ;
sc = str.substr(2*la+2*lb , lc) ;
if(sa1 == sa2 && sa1 == sa3 && sb1 == sb2 && sb1 == sb3 && sa1 != sb1 && sa1 != sc && sb1 != sc) {
printf("Yes\n") ;
return ;
}
}
}
}
printf("No\n") ;
} int main()
{
int t ;
scanf("%d" ,&t) ;
while(t--) {
string str ;
cin>>str ;
for(int i = 0 ; i < (int)str.length() ; ++i) {
if(isalpha(str[i]) == false) {
str.replace(i , 1 ,"") ;
--i ;
}
}
judge(str) ;
}
return 0;
}
用了STRING,但我对STRING还不是很熟,就想写一个不用STRING的,也用他们的这个思想。
但是写的过程出现了很多问题。
首先是模仿写一个str.substr(0 , la) ;开始写了一个这样的sub
char* sub(char* s,int a,int b)
{
char str[155];
int k=0;
for(int i=a;i<=b;i++)
{
str[k++]=s[i];
}
str[k]='\0';
return str;
}
但是编译器有一个警告,而且最后也没有AC我不知道原因是什么,自己试的结果都正确
警告的原因是char str[155];申请的空间会在函数结束销毁,正确的写法是
char * substr(const char * s, int n1, int n2) /*从s中提取下标为n1~n2的字符组成一个新字符串,然后返回这个新串的首地址*/
{
char * sp = (char*)malloc(sizeof(char) * (n2 - n1 + 2));
int i, j = 0; for (i = n1; i <= n2; i++)
{
sp[j++] = s[i];
}
sp[j] = 0;
return sp;
}</span>
这样申请堆空间,最后用完之后要手动释放
sub = substr(s, 0, 5); /*提取s[0]~s[5]元素组成新子串,并保存到sub中*/
free(sub);/*释放sub所占用的空间*/
</span>
更多有关返回一个字符串的方法参考另一篇文章:http://blog.csdn.net/turkeyzhou/article/details/6104135
最后我使用了函数参数而不适用返回值来得到字串
void sub(char str[],char s[],int a,int b)
{
int k=0;
for(int i=a;i<b+a;i++)
{
str[k++]=s[i];
}
str[k]='\0';
}</span>
最后也AC了。
#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1555 void sub(char str[],char s[],int a,int b)
{
int k=0;
for(int i=a;i<b+a;i++)
{
str[k++]=s[i];
}
str[k]='\0';
} int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
char a[N],b[N];
cin>>b;
int k=0;
for(int i=0;i<(int)strlen(b);i++)
{
if( (b[i]>='A'&&b[i]<='Z') || (b[i]>='a'&&b[i]<='z'))
a[k++]=b[i];
}
a[k]='\0';
char a1[N],a2[N],a3[N],b1[N],b2[N],b3[N],c[N];
int len=strlen(a);
int flag=0;
for(int i=1;i<=len/2;i++){
if(flag)break;
for(int j=1;j<=len/2;j++){
if(3*i+2*j==len){
sub(a1,a,0,i);
sub(b1,a,i,j);
sub(a2,a,i+j,i);
sub(b2,a,i+j+i,j);
sub(a3,a,i+j+i+j,i);
if(strcmp(a1,a2)==0&&strcmp(a2,a3)==0&&strcmp(b1,b2)==0&&strcmp(a1,b1)!=0){
flag=1;
break;
}
}
}
}
for(int i=1;i<=len/2;i++){
if(flag==2)break;
for(int j=1;j<=len/2;j++){
if(flag==2)break;
for(int k=1;k<=len/2;k++){
if(3*i+3*j+k==len){
sub(a1,a,0,i);
sub(b1,a,i,j);
sub(a2,a,i+j,i);
sub(b2,a,i+j+i,j);
sub(c,a,2*i+2*j,k);
sub(a3,a,2*i+2*j+k,i);
sub(b3,a,3*i+2*j+k,j);
if(strcmp(a1,a2)==0&&strcmp(a2,a3)==0&&strcmp(b1,b2)==0&&strcmp(b2,b3)==0&&strcmp(a1,b1)!=0&&strcmp(a1,c)!=0&&strcmp(b1,c)!=0){
flag=2;
break;
}
}
}
}
}
if(flag)puts("Yes");
else puts("No");
}
return 0;
}
不过AC之前我还犯了一个错误,再判断ABABCAB这种时,我只比较了b1和b2相同,没有比较b2和b3相同,结果抓耳挠腮了半天不知道WA的原因,还是不够仔细。
if(strcmp(a1,a2)==0&&strcmp(a2,a3)==0&&strcmp(b1,b2)==0&&strcmp(b2,b3)==0&&strcmp(a1,b1)!=0&&strcmp(a1,c)!=0&&strcmp(b1,c)!=0){
开始少了&&strcmp(b2,b3)==0这句!
版权声明:本文为博主原创文章,未经博主允许不得转载。
ZOJ 3810 Pretty Poem 分类: ACM 2015-05-17 14:40 83人阅读 评论(0) 收藏的更多相关文章
- iOS正则表达式 分类: ios技术 2015-07-14 14:00 35人阅读 评论(0) 收藏
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- IIS上虚拟站点的web.config与主站点的web.config冲突解决方法 分类: ASP.NET 2015-06-15 14:07 60人阅读 评论(0) 收藏
IIS上在主站点下搭建虚拟目录后,子站点中的<system.web>节点与主站点的<system.web>冲突解决方法: 在主站点的<system.web>上一级添 ...
- C++实现不能被继承的类——终结类 分类: C/C++ 2015-04-06 14:48 64人阅读 评论(0) 收藏
1. 问题 C++如何实现不能被继承的类,即终结类.Java中有final关键字修饰,C#中有sealed关键字修饰,而C++目前还没有类似的关键字来修饰类实现终结类,需编程人员手动实现. ...
- Dungeon Master 分类: 搜索 POJ 2015-08-09 14:25 4人阅读 评论(0) 收藏
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20995 Accepted: 8150 Descr ...
- Codeforces 343D Water Tree 分类: Brush Mode 2014-10-05 14:38 98人阅读 评论(0) 收藏
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- Beautiful People 分类: Brush Mode 2014-10-01 14:33 100人阅读 评论(0) 收藏
Beautiful People Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- Hdu 1009 FatMouse' Trade 分类: Translation Mode 2014-08-04 14:07 74人阅读 评论(0) 收藏
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 《将博客搬至CSDN》 分类: 勉励自己 2014-09-05 14:29 43人阅读 评论(0) 收藏
搬家啦,上博客园关注我哦http://www.cnblogs.com/AsuraRoute 版权声明:本文为博主原创文章,未经博主允许不得转载.
- sql 视图 按where条件多个字段取一个 分类: SQL Server 2014-12-01 14:09 308人阅读 评论(0) 收藏
首先介绍一下 Case ..When...Then..End 的用法: CASEJiXiaoFind_RowID WHEN '1' THENJiXiao_Money1 WHEN '2' THEN ...
随机推荐
- JQuery操作Ajax
一.jQuery - AJAX 简介 AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). AJAX 是与服务器交换数据的艺术,它在 ...
- 【转】PWM占空比和分辨率
占空比是接通时间与周期之比冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比,如一个PWM的频率是1000Hz, ...
- HDU 1851 (巴什博奕 SG定理) A Simple Game
这是由n个巴什博奕的游戏合成的组合游戏. 对于一个有m个石子,每次至多取l个的巴什博奕,这个状态的SG函数值为m % (l + 1). 然后根据SG定理,合成游戏的SG函数就是各个子游戏SG函数值的异 ...
- POJ 3287 (基础BFS) Catch That Cow
这是做的第一道BFS,很基础很简单的题目 广度优先搜索算法如下:(用QUEUE)(1) 把初始节点S0放入Open表中:(2) 如果Open表为空,则问题无解,失败退出:(3) 把Open表的第一个节 ...
- [转] Qt 多线程学习
Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...
- (C#基础) byte[] 之初始化, 赋值,转换。
byte[] 之初始化赋值 用for loop 赋值当然是最基本的方法,不过在C#里面还有其他的便捷方法. 1. 创建一个长度为10的byte数组,并且其中每个byte的值为0. byte[] myB ...
- scala学习笔记(1):基本语法与容器
1 var 可变,val 不可变 var (a,b) = (10,20) 分别对a,b赋值 a=10, b=20 var a,b = (10,20)则 是a=(10,20) b=(10,20) 2 L ...
- Java之路
Java程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类.集合类.正则表达式.XML和属性文件 图形编程 AWT ...
- 为什么Jquery对input file控件的onchange事件只生效一次
今天在做jquery对input file控件的onchange事件进行监听,就一直只生效一次,不知道Jquery为什么对file控件没有做到每次改变触发onchange事件的效果,但是还是有好几种解 ...
- PHP写入Txt
function writelog($str) { $open=fopen("log.txt","a" ); fwrite($open,$str); fclos ...