HDU1686 Oulipo (KMP algoritmo)

conexión de temas:

Haga clic aquí para obtener el título original

análisis

¿Cuántas veces a la cadena de destino, donde la cadena de origen para que coincida con el requerido, por lo que lo que hay que mejorar sobre la base del algoritmo KMP, j llega al final de la cadena de destino, es decir, cuando j == strlen (cadena de destino) usando j = nex [j-1] para encontrar la cadena de destino es la subcadena más larga repetida, siguió, en el principio del tiempo, todo el tiempo de bucle utilizando el juicio () strlen, siempre es tiempo de espera, debe estar en mientras fuera del bucle utilizando la primera tienda len strlen, por lo que no tiene tiempo de espera.

código:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int MAXN = 1000005;
char t[MAXN],w[10005];
int nex[10005],test,ans;

void GetNext(char *ch)
{
    nex[0] = -1;
    int k = -1,j=0;
    int len = strlen(ch);
    while(j < len)
    {
        if(k == -1 || ch[k] == ch[j])
            nex[++j] = ++k;
        else
            k = nex[k];
    }
}

int main()
{
    scanf("%d",&test);
    while(test--)
    {
        ans = 0;
        memset(nex,0,sizeof(nex));
        scanf("%s",w);
        scanf("%s",t);
        GetNext(w);
        int i = 0,j = 0;
        int sourLen = strlen(t),desLen = strlen(w);  //提前执行strlen,否则在while循环中执行会超时
        while(i <= sourLen)
        {
            if(j == desLen)
            {
                ans++;
                j = nex[j-1];
                i--;
            }
            if(i == sourLen) break;
            if(j==-1 || t[i] == w[j])
            {
                ++i;
                ++j;
            }
            else
                j = nex[j];
        }
        printf("%d\n",ans);
    }
    return 0;
}

Publicado 61 artículos originales · ganado elogios 7 · vistas 3630

Supongo que te gusta

Origin blog.csdn.net/weixin_42469716/article/details/104817439
Recomendado
Clasificación