• HDU 6264(思维)


    题面:

    Problem A. Super-palindrome

    You are given a string that is consistedof lowercase English alphabet. You are supposed to change it into asuper-palindrome string in minimum steps. You can change one character instring to another letter per step.

    A string is called asuper-palindrome string if all its substrings with an odd length are palindromestrings. That is, for a string s, if its substring si···j satisfies j i + 1 is oddthen si+k = sjk fork= 0,1,··· ,ji + 1.

    Input

    The first line contains an integer T (1 ≤ T ≤100) representing the number of test cases.

    For each test case, the only line containsa string, which consists of only lowercase letters. It is guaranteed that thelength of string satisfies 1 ≤ |s| ≤ 100.

    Output

    For each test case, print one line with aninteger refers to the minimum steps to take.

    Example

    standard input

     

    standard output

    3
    ncncn
    aaaaba
    aaaabb

    0

    1

    2

     

    Explanation

    For second testcase aaaaba, just change letter bto a in one step.

        
        题目描述:给你一个字符串,问你需要更改里面多少个字符,使得原字符串变为一个超级回文串。超级回文串是指字串为奇数长度的都为回文串的串。
        题目分析:分析样例之后容易得出,对于这样一个超级回文串,只有两种情况可以满足。
         一为串内所有的字符都是相同的。
        二是该串只有两种字符组成,且这两种字符是交替出现的。
         能够发现这个规律的话,这道题就可以进行模拟。因为数据范围很小(100而已),因此我们可以直接进行暴力的匹配。
        我们首先先将串中不相同的字符储存起来,枚举两种字符的种类,再跟原串进行匹配,最后去最小的更改量即可。

        总结:最近做字符串算法做得有些多了,上来拿到题直接就往Manache上面去想了(还好队友很给力),对于这些题还得拓宽思维才行!!
        
    #include <bits/stdc++.h>
    #define maxn 1005
    using namespace std;
    string str,tmp;
    bool vis[maxn];
    int main()
    {
        int t;
        cin>>t;
        while(t--){
            cin>>str;
            memset(vis,0,sizeof(vis));
            for(int i=0;i<str.length();i++){
                if(!vis[str[i]-'a']){
                    tmp+=str[i];
                    vis[str[i]-'a'];
                }
            }
            int ans=0x3f3f3f3f;
            for(int i=0;i<tmp.length();i++){
                for(int j=0;j<tmp.length();j++){
                    char c[2];
                    c[0]=tmp[i],c[1]=tmp[j];
                    int cnt=0;
                    for(int k=0;k<str.length();k++){
                        if(str[k]!=c[k%2]) cnt++;
                    }
                    ans=min(ans,cnt);
                }
            }
            cout<<ans<<endl;
            tmp.clear();//记得清零,否则会影响下一组数据
        }
    }
    

  • 相关阅读:
    32位和64位的区别
    Git--版本管理的使用及理解
    Maven使用详解
    记录centos7下tomcat部署war包过程
    SSM三大框架整合教程
    Mybatis 框架搭建实例
    Eclipse 出现select type (? = any character,*= any String,Tz=TimeZone)
    JDBC 操作数据库实例
    mysql 常用命令语法
    MySQL下载安装详情教程(Windows)
  • 原文地址:https://www.cnblogs.com/Chen-Jr/p/11007303.html
Copyright © 2020-2023  润新知