列表

详情


HJ32. 密码截取

描述

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

数据范围:字符串长度满足

输入描述

输入一个字符串(字符串的长度不超过2500)

输出描述

返回有效密码串的最大长度

示例1

输入:

ABBA

输出:

4

示例2

输入:

ABBBA

输出:

5

示例3

输入:

12HHHHA

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 2ms, 内存消耗: 192KB, 提交时间: 2021-10-09

#include <stdio.h>
#include <string.h>
int main(void)
{
	int i, j, len, max, tmp;
	char s[2888];
	while(scanf("%s", s) != EOF)
	{
		int i, j, k, len = strlen(s), half_len = len>>1, max = 0, tmp;
		for(i=0; i<len; i++){
			if(s[i] == s[ i+1 ]){
				j = i-1;   k = i+2;
				if(i < half_len)
					while(j>=0 && s[j]==s[k]) j--, k++;
				else
					while(k<len && s[j]==s[k]) j--, k++;
				if((tmp = k-j-1) > max) max = tmp;
			}
			if(s[ i-1 ] == s[ i+1 ]){
				j = i-2;   k = i+2;
				if(i < half_len)
					while(j>=0 && s[j]==s[k]) j--, k++;
				else
					while(k<len && s[j]==s[k]) j--, k++;
				if((tmp = k-j-1) >= max) max = tmp;
			}
		}
		printf("%d\n", max);
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 192KB, 提交时间: 2021-09-19

#include<stdio.h>
int main(){

    char str[10000];
   
    while(gets(str)){
        int max=1;
    int l=strlen(str);
    
    for(int i=1;i<l;i++)
    {
        int temp=1;
        for(int j=1;j<=i;j++)
        {
            if(str[i-j]==str[i+j])
            {
                temp+=2;
            }
            else{
                break;
            }
        }
        max=max>temp?max:temp;
    }
    for(int i=1;i<l;i++)
    {
        int temp=0;
        for(int j=0;j<=i;j++)
        {
            if(str[i-j]==str[i+j+1])
            {
                temp+=2;
            }
            else{
                break;
            }
        }
        max=max>temp?max:temp;
    }
    printf("%d\n",max);
    }
}

上一题