2 void cpp1 void_cpp1 于 2016.03.13 16:17 提问

ACM的小伙伴进,uva-1584有些小问题求大神解惑
acm

Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence CGAGTCAGCT", that is, the last symbolT" in CGAGTCAGCT" is connected to the first symbolC". We always read a circular sequence in the clockwise direction.

\epsfbox{p3225.eps}
Since it is not easy to store a circular sequence in a computer as it is, we decided to store it as a linear sequence. However, there can be many linear sequences that are obtained from a circular sequence by cutting any place of the circular sequence. Hence, we also decided to store the linear sequence that is lexicographically smallest among all linear sequences that can be obtained from a circular sequence.

Your task is to find the lexicographically smallest sequence from a given circular sequence. For the example in the figure, the lexicographically smallest sequence is ``AGCTCGAGTC". If there are two or more linear sequences that are lexicographically smallest, you are to find any one of them (in fact, they are the same).

Input

The input consists of T test cases. The number of test cases T is given on the first line of the input file. Each test case takes one line containing a circular sequence that is written as an arbitrary linear sequence. Since the circular sequences are DNA sequences, only four symbols, A, C, G and T, are allowed. Each sequence has length at least 2 and at most 100.

Output

Print exactly one line for each test case. The line is to contain the lexicographically smallest sequence for the test case.

The following shows sample input and output for two test cases.

Sample Input

2

CGAGTCAGCT

CTCC
Sample Output

AGCTCGAGTC
CCCT

我的代码如下

#include <iostream>
#include <cstring>
using namespace std;
int small(const char* s,int p,int q);
#define maxn 105
int main()
{
    int n;//测试数
    cin>>n;
    while(n--){
        //为何不能用char *str={0};?
        char str[maxn];
        cin>>str;
        int len=strlen(str);
        int ans=0;
        for(int i=1;i<len;i++){
            if(small(str,i,ans))
                ans=i;
        }
        for(int i=0;i<len;i++){
            putchar(str[(ans+i)%len]);
        }
        putchar('\n');
    }
    return 0;

}

int small(const char* s,int p,int q){  //比较表示法p和表示法q字典序大小
    int n=strlen(s);
    for(int i=0;i<n;i++){
        if(s[(p+i)%n]!=s[(q+i)%n])
            return s[(p+i)%n]<s[(q+i)%n];
    }
    return 0;


}


问题疑惑在注释里,如果用注释里的会报空指针错误( returned -1073741819 (0xC0000005))问的问题很小白,让各位见笑了囧。

1个回答

leilba
leilba   Rxr 2016.03.13 17:37
已采纳
 char *str={0};
  cin>>str;

这样写,你如何让机器知道str的大小?要知道下面还有输入语句cin的呀,cin会根据str的大小来选择性输入的,所以你这样写当然会报错。
你可以改成下面这样,指定str的大小,然后再输入的话就没问题了

 char *str = new char[maxn];
 cin>>str;
void_cpp1
void_cpp1 谢谢,我明白了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ACM大神之路自述
3xian之所在  最后一天,漫天飘起了雪花,假装欢送我离去。 这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong Answer的纠缠。还好lynncui在期间独挡一面过掉D。最终成绩不好,然而没有遗憾,从不遗憾。 相比之下,来自全球的队伍让我看到了很强大的实力,每一道题都有人过,包括SJTU欺骗性提交的H都被人干掉了。身为
大神的ACM训练计划(详细)
看完人家的博客,发现任重道远。。。 一位高手对我的建议: 一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程序与debug上。  下面给个计划你练练: 第一阶段: 练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至
UVa-1584 Circular Sequence
#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool cmp(char a[],int p,int q,int k) { for(int i=0;i<k;i++) { if(a[(p+i)%k]<a[(q+i)%k]) return 1;
UVA-1584 - Circular Sequence
/***************************************/ 简单题,小白,第一次写博客,寻找字典排序的最小,直接枚举所有的情况放到容器中,然后sort正向排序后输出最小的那个就好了。 可用substr(size_type index)截取字符串实现字符串环。 /***************************************/ Some DNA seq
UVA-1584 Circular Sequence
Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence “CGAGTCAGCT”, that is, the last symbol “T” in “CGAGTCAGCT” is connected to the first symbol “C”. We
大神与三位小伙伴
编程之美资格赛2014
编程之美-大神与三位小伙伴
本题就是一个排列组合的问题,正向思考得到的方案多且杂,这时应采用逆向思考,我这里先计算出所有方案数目,再减去有两个相同的情况。 所有方案数目计算: 代码 #include #include using namespace std; typedef long long ll; const int md = 1e9+7; int main() { ll T; ll N; cin
编程之美 大神与三个小伙伴
#include #include using namespace std; const long long great = 1000000007; bool isSame(long long a, long long b, long long c) { if (a == b && b == c) return true; if (a == b) return false;
大神的acm计划
因为我看的博客也是转的,不知道原文的网址,所以我就贴一下我看的博客的网址吧http://blog.csdn.net/victordiao/article/details/51981233 下面为文章: ————————————————————————————————看完人家的博客,发现任重道远。。。一位高手对我的建议:一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要
【期望】acm题目
百事世界杯之旅 描述: ……在2003年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可以参加百事世界杯之旅的抽奖活动,获取球星背包、随身听,更可以赴日韩观看世界杯。还不赶快行动!……” 你关上电视,心想:假设有n个不同球星的名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢? 输入: 输入一个数字n,2≤n≤33,表示不