[ACdream]女神教你字符串——违和感

题目描述:

女神最喜欢字符串了,字符串神马的最有爱了。

女神是一个重度强迫症患者,面对不是对称的东西,她会觉得太违和了,就会爆炸。所以她手上的字符串都是回文的,像什么a,b,aabaa,abcba,上海自来水来自海上...等等。

女神的人生理想就是把所有字符串都改造成回文串!这是非常宏伟的理想。

一切理想都从最简单的开始。

好了,现在女神面前有一堆字符串,然后请问能否通过删去一个字符,使这个字符串变成回文串?

Input

多组数据,每组数据是一个字符串S,仅有英文小写字母组成

1<=|S|<=100000

Output

对于每组数据,若可以通过删除一个字符来变成回文串,则输出该字符的下标,若不能或不需要删除,请输出-1

Sample Input

aaab
baa
aaa

Sample Output

3
0
-1

解题思路:    这题折腾我好久,个人因为一些特殊的情况漏掉了,导致提交一直错误,我的做法步骤是,1、判断不删除字符是不是符合,2、去掉第一个字符是不是符合,3、去掉最后一个字符是不是符合,4、用一个i、j标记首位的下标,找到不相等的位置,开始判断,如果i的位置等于len/2,需要删除的字符位置就是i,如果不是就要分4种情况来判断了,第一种就是s[i+1]==s[j]&&s[i]==s[j-1],第二种s[i+1]!=s[j]&&s[i]==s[j-1],第三种s[i+1]==s[j]&&s[i]!=s[j-1]第四种s[i+1]!=s[j]&&s[i]!=s[j-1],用if来解决。

AC代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int flag,sum;
char s[100005];

int judge1(int si,int sj,int m)
{
    int i,j;
    for(i=si,j=sj; i<m; i++,j--)
    {
        if(s[i]!=s[j]) return 0;
    }
    return 1;
}
int main()
{
    int len,i,j,m;
    while(scanf("%s",s)!=EOF)
    {
        sum=0;
        len=strlen(s);
        m=len/2;
        if(judge1(0,len-1,m))
        {
            printf("-1\n");continue;
        }
        if(len%2==1)
        {
            if(judge1(1,len-1,m+1))
            {
               printf("0\n");continue;
            }
            if(judge1(0,len-2,m-1))
            {
                printf("%d\n",len-1);continue;
            }
        }
        if(len%2==0)
        {
            if(judge1(1,len-1,m))
            {
               printf("0\n");continue;
            }
            if(judge1(0,len-2,m))
            {
                printf("%d\n",len-1);continue;
            }
        }

        for(i=0,j=len-1; i<m; i++,j--)
        {
            if(s[i]!=s[j])
            {
                if(i!=m)
                {
                    if(s[i+1]==s[j]&&s[i]!=s[j-1])
                    {
                        if(len%2==1) m++;
                        if(judge1(i+1,j,m)==1)
                        {
                            sum=1;
                            flag=i;
                        }
                    }
                    else if(s[i+1]!=s[j]&&s[i]==s[j-1])
                    {
                        if(!judge1(i,j-1,m)) break;
                        else
                        {
                            sum=1;
                            flag=j;
                        }
                    }
                    else if(s[i+1]==s[j]&&s[i]==s[j-1])
                    {
                        int mm=m,mm2=m;
                        if(len%2==1) mm++;
                        if(!judge1(i+1,j,mm))
                        {
                            if(!judge1(i,j-1,mm2)) break;
                            else
                            {
                                sum=1;
                                flag=j;
                            }
                        }
                        else
                        {
                            sum++;flag=i;
                        }
                    }
                }
                else
                {
                    sum=1;
                    flag=i;
                }
                break;
            }

        }
        if(sum==1) printf("%d\n",flag);
        else printf("-1\n");
    }
    return 0;
}
 
时间: 2024-12-29 23:56:44

[ACdream]女神教你字符串——违和感的相关文章

[ACdream] 女神教你字符串——三个气球

Problem Description 女神邀请众ACdream开联欢会,显然作为ACM的佼佼者,气球是不能少的~.女神准备了三种颜色的气球,红色,黄色,绿色(交通信号灯?) 有气球还不能满足女神,女神要在气球上写字. 写什么好呢~?字符串神马的最有爱了~ 女神先拿出一个字符串,然后把字符串的每一个真·前缀写到了黄色气球上面,每一个真·后缀写到了绿色气球上面,每一个真·子串写到了红色气球上面. 对于一个字符串s[1...n],真·前缀为s[1...i](1<=i<n)·,真·后缀为s[j...

[ACdream]女神教你字符串——导字符串

Problem Description 正如大家知道的,女神喜欢字符串,而在字符串中,女神最喜欢回文字符串,但是不是所有的字符串都是回文字符串,但是有一些字符串可以进行“求导”来变成回文字符串. 字符串中只包含小写字母.求导过程如下,C++: string dif(const string x) { if(x.length()<=1) return ""; string res=""; for(int i=1;i<x.length();++i) res+

python基础数据类型----整数 ,字符串【常用操作方法】,布尔值,for循环

Python基础数据类型(4.29) bool str int 三者之间的转换 str索引切片,常用操作方法 for循环(大量的练习题) 1.基础数类型总览 整数(int) ,字符串(str),布尔值(bool),列表(list),元组(tuple),字典(dict),集合(set). 10203 123 3340 int 主要用于计算+- * / 等等 '今天吃了没?' str 存储少量的数据,并进行相应的操作.str1 + str2, str *int , 索引,切片, 其他操作方法 Tru

OSChina 娱乐弹弹弹——程序猿眼中的女人

程序猿,整天跟操作系统,编程语言,各种打交道,那么程序猿眼中的女人是什么样子的呢? 有程序猿曾经用操作系统形容过各种类型的女人,有程序猿用编程语言描述各种星座的女人. 小编找到了几个版本,请看: 编程语言 NO1: 计算机语言的实质其实是为了让人类能够更好与计算机打交道,最终结果都是通过编译成二进制代码或通过解释器转译成二进制代码的形式,由计算机来 执行.而二进制就是 0 和1,假设 1 代表男人,0 代表女人,那么瞬间就可以发现世界就变成了一台大"计算机".而爱情和情爱也可以看成是

如果编程语言是妹纸

试想一下,当Java.C++.Python.Ruby.PHP.C#.JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类“美女”的吧! Java 犹如宫泽贤治的<不畏风雨>中出现的.性格木讷的女孩子.从小就由于迟钝和大食量等特征被别人当作笨蛋,从小学入学开始进入田径部.坚持跑步,在中长跑中经常取得好成绩,给人以活泼的印象.是十分努力的女孩子. 她的家境并不算好.父亲Sun是有才能的艺术家,但不擅长理财,在她14岁的时候因为苦于借债积劳成

PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点

汇编: C: Java: C#: PHP: Python: Go: Haskell: Lisp: C++: &lt;img src="https://pic3.zhimg.com/3345a2825f1f983cb49fb2ea67ccfa56_b.jpg" data-rawwidth="300" data-rawheight="440" class="content_image" width="300&qu

CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍,都容易引人误解. 为此,我打算重新写个系列来介绍最新的版本,让大伙从传统的ORM编程过渡到自动化框架型思维编程(自已造的词). 于是:这个新系列的名称就叫:CYQ.Data 从入门到放弃ORM系列 什么是:CYQ.Data 1:它是一个ORM框架. 2:它是一个数据层组件. 3

ZJOI Day 2 游记

---恢复内容开始--- 去ZJOI Day 2打了一会酱油...各种神犇大爷都来屠,南外的小朋友也来屠我们了真是感动...没有看到毛爷爷真是可惜.. Day[-1] 早上还在上课,吃完中饭立马跑去找Xu.可是Xu不在,CGJ打她电话都不接...完了请不到假了...然后就直接出去了...坐的大巴真是感人至深= =!然后咿咿呀呀晃晃悠悠就到了余姚这种破地方>_> 然后在wjz的指引下膜了wjz,感觉RP++ >_< YYHS傻逼学校,各种积分(激奋)读书的红色大横条真是感人肺腑O.o

【BZOJ4016】[FJOI2014]最短路径树问题 最短路径树+点分治

[BZOJ4016][FJOI2014]最短路径树问题 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径(如路径A为1,32,11,路径B为1,3,2,11,路径B字典序较小.注意是序列的字典序的最小,而非路径中节点编号相连的字符串字典序最小).到达该点后按原路返回,然后往其他点走,直到所有点都走过. 可以知道,经过的边会构成一棵最短