Subcadena consulta de la mitad

Enlace: https: //ac.nowcoder.com/acm/contest/1083/B
Fuente: Red de Ganado-off

Dada una cadena S de longitud n y q consultas. Para cada consulta entrará en una cadena t, es necesario determinar la cadena s y T no es de la subcadena. Substring se define que la presencia de una escala arbitraria a <b <c <d < e, a continuación, "s [a] s [b ] s [c] s [d] s [e]" constituir cadena de un sub s. La subcadena "abc" tiene "a", "b", "c", "ab", "ac", "BC", "abc".
Descripción Entrada:
La primera línea de los dos números n, q. 1 <= n, q <= 1e5.

La segunda línea de una longitud n s cadena de caracteres, todos los caracteres están en caracteres latinos en minúscula.

Q próximos líneas cada cuerda t. 1 <= | t | <= 50.
Descripción de la salida:
Para cada consulta, si t es la cadena s, salida "si", y por lo demás salidas "NO". Cada respuesta por línea.
Ejemplo 1
de entrada

Copia
. 8. 4
ababcbaa
ABAC
ACCB
AAAA
ABCBA
salida

Copiar

NO

El significado de los problemas: la longitud de la cadena de entrada s y q enésimo interrogatorios consulta cada cadena de entrada t Q t es una subcadena s es la
idea: mediante el registro de matriz de dos dimensiones para encontrar la posición de todas las letras aparecen cada vez con un bipartito mayor que el valor actual posición, si el valor es mayor que la posición actual no existe en nombre de la subcadena ausencia.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
vector <int> v[30];

int main()
{
    int n,q;
    string t,s;

    cin >> n >> q >> s;

    for(int i=0;i<n;i++)
        v[s[i]-'a'].push_back(i);///记录每个字母出现的各个位置

    while(q--)
    {
        cin >> t;

        int pos=-1;
        bool flag=0;
        vector<int>::iterator it;

        for(int i=0;i<t.size();i++)
        {
             it=upper_bound(v[t[i]-'a'].begin(),v[t[i]-'a'].end(),pos);///寻找当前字母出现的位置

             if(it==v[t[i]-'a'].end())///如果比之前字母出现的位置要大则符合条件 要小即找不到
             {
                 flag=1;
                 break;
             }
             pos=*it;///更新pos的值
        }

        if(flag)
           cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }

    return 0;
}


Publicado 54 artículos originales · ganado elogios 0 · Vistas 1216

Supongo que te gusta

Origin blog.csdn.net/weixin_44144278/article/details/100642833
Recomendado
Clasificación