☀L2-008 La subcadena simétrica más larga (25 puntos) [PTA] [violencia]

Para una cadena dada, esta pregunta requiere que genere la longitud de la subcadena simétrica más larga. Por ejemplo, dado Is PAT&TAP symmetric?que la subcadena simétrica más larga es s PAT&TAP s, debería generar 11.

Formato de entrada:

Ingrese una cadena no vacía que no exceda 1000 en una línea.

Formato de salida:

Genere la longitud de la subcadena simétrica más larga en una línea.

Muestra de entrada:

Is PAT&TAP symmetric?

Salida de muestra:

11

Es una forma más violenta de resolver la subcadena simétrica más larga sin un carro tirado por caballos. Cuando lo vi, también vi la forma de usar dp

int max = 1; // ★★★★★ Cadena no vacía, la longitud de la subcadena simétrica más corta es 1; de lo contrario, la muestra tendrá una

---------------------

Si la subcadena es incluso simétrica

para ( int i = 0; i <len; i ++)

    {

        int x = yo, y = yo + 1;

        int años = 0;

        while (s [x] == s [y] && x> = 0 && y <len)

        {

            X--;

            y++;

            años + = 2;

        }

        si (ans> max)

        {

            max = años;

        }

    }

---------------------

Si la subcadena es extrañamente simétrica

para ( int i = 1; i <len; i ++)

    {

        int x = i-1, y = i + 1;

        int ans = 1; // Respuesta primero agregue el carácter en el medio

        while (s [x] == s [y] && x> = 0 && y <len)

        {

            X--;

            y++;

            años + = 2;

        }

        si (ans> max)

        {

            max = años;

        }

    }

código ac:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;

int main()
{
    string s;
    getline(cin,s);
    int len=s.size();
    int max=1;
    for(int i=0;i<len;i++)
    {
        int x=i,y=i+1;
        int ans=0;
        while(s[x]==s[y]&&x>=0&&y<len)
        {
            x--;
            y++;
            ans+=2;
        }
        if(ans>max)
        {
            max=ans;
        }
    }
    for(int i=1;i<len;i++)
    {
        int x=i-1,y=i+1;
        int ans=1;
        while(s[x]==s[y]&&x>=0&&y<len)
        {
            x--;
            y++;
            ans+=2;
        }
        if(ans>max)
        {
            max=ans;
        }
    }
    cout<<max;
    return 0;
}

Referencia: https://blog.csdn.net/qq_34115899/article/details/79680882?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160629601719195283012726%2522%252C%2522scm%252230%25340 .% 2522% 257D & request_id = 160629601719195283012726 & biz_id = 0 & utm_medium = distribuir.pc_search_result.none-task-blog-2 ~ blog ~ first_rank_v1 ~ rank_blog_v1-26-79680882.pcgest_v1_v1-26-79680882.pcgest_v1_v1-26-79680882.pcgest_v1_v1_long_blog. 

 

Algoritmo de carro tirado por caballos

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000
using namespace std;

char s[MAX + 1];
char t[MAX * 2 + 5] = {'@','#'};
int p[MAX * 2 + 5];
int Manacher(char *str) {
    int len = strlen(str);
    for(int i = 1;i <= len;i ++) {
        t[i * 2] = str[i - 1];
        t[i * 2 + 1] = '#';
    }
    t[len * 2 + 2] = 0;
    int mi = 0,rpoint = 0,mr = 0;
    for(int i = 1;t[i];i ++) {
        p[i] = i < rpoint ? min(rpoint - i,p[mi * 2 - i]) : 1;
        while(t[i + p[i]] == t[i - p[i]]) p[i] ++;
        if(i + p[i] > rpoint) {
            mi = i;
            rpoint = i + p[i];
        }
        if(mr < p[i]) mr = p[i];
    }
    return mr - 1;
}
int main() {
    int i = 0;
    while((s[i] = getchar()) != '\n') i ++;
    s[i] = 0;
    printf("%d",Manacher(s));
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_43660826/article/details/110150945
Recomendado
Clasificación