PTA 7-44 Similitud de archivo basada en la frecuencia de palabras (procesamiento de cadena + contenedor de set)

Puntos de prueba para esta pregunta:

  • Procesamiento de cadenas
  • establecer el uso del contenedor

Se implementa un cálculo de similitud de archivo simple y original, es decir, la similitud se define por la relación del vocabulario común de los dos archivos con el vocabulario total. Para simplificar el problema, aquí no se considera chino (porque la segmentación de palabras es demasiado difícil), solo se consideran palabras en inglés con una longitud de no menos de 3 y no más de 10, y solo se consideran las primeras 10 letras si la longitud excede 10.
Formato de entrada: La
entrada primero da un entero positivo N (≤100), que es el número total de archivos. Luego, el contenido de cada archivo se da en el siguiente formato: primero, se da el texto del archivo, y finalmente solo se da un carácter # en una línea, que indica el final del archivo. Después del final del contenido de N del documento, dado el número de consultas total M (≦ 10
. 4
), seguido de M líneas, se da cada par de números de documentos, separadas por un espacio entre ellos. Aquí se supone que los archivos están numerados del 1 al N en el orden indicado.
Formato de salida: para
cada consulta, la similitud de los dos archivos se genera en una línea, es decir, el vocabulario común de los dos archivos representa el porcentaje del vocabulario total de los dos archivos, con una precisión de 1 decimal. Tenga en cuenta que una "palabra" aquí solo incluye palabras en inglés compuestas solo de letras en inglés, con una longitud de no menos de 3 y no más de 10, y aquellas con una longitud de más de 10 solo consideran las primeras 10 letras. Las palabras están separadas por letras que no están en inglés. Además, la misma palabra con diferentes mayúsculas se considera la misma palabra, por ejemplo, "Usted" y "usted" son la misma palabra.
Entrada de muestra:
3
Aaa Bbb Ccc
#
Bbb Ccc Ddd
#
Aaa2 ccc Eee
está en Ddd @ Fff
#
2
1 2
1 3
Salida de muestra:
50.0%
33.3%

Esta pregunta es principalmente sobre el procesamiento de cadenas. Necesitamos leer los datos de cada línea, luego procesar los segmentos de acuerdo a si son letras en inglés, y luego usar el contenedor establecido para almacenar diferentes datos.

La epidemia de este año está en casa. A veces, debido a problemas, hay muchas tareas con las que lidiar, por lo que la eficiencia no es alta, todavía tengo muchas metas que lograr y hay muchas cosas que hacer. ¡Mi vida será maravillosa, vamos!

El código completo es el siguiente:

#include <iostream>
#include <set>
#include <string>
#include <cctype>
using namespace std;

#define MAXN 105

int N, M;                // 文件总数,查询总数
string str;              // 读取每一行
set<string> files[MAXN]; // 文件中的单词

void handleStr(string str, int No)
{
    string word;
    str += "."; // 最后一个单词能够处理
    for (int i = 0; i < str.size(); i++)
    {
        if (isalpha(str[i]))
        {
            if (word.size() < 10)
                word += tolower(str[i]);
        }
        else
        {
            if (word.size() > 2 && word.size() < 11)
                files[No].insert(word);
            word.clear();
        }
    }
}

int main()
{
    scanf("%d", &N);
    for (int i = 1; i <= N; i++)
    {
        do
        {
            getline(cin, str);
            handleStr(str, i);
        } while (str != "#");
    }
    scanf("%d", &M);
    int u, v;
    int same = 0, total = 0;
    for (int i = 0; i < M; i++)
    {
        scanf("%d%d", &u, &v);
        total = (int)files[u].size() + (int)files[v].size();
        same = 0;
        for (set<string>::iterator it = files[u].begin(); it != files[u].end(); it++)
        {
            if(files[v].find(*it) != files[v].end())
            {
                same++;
                total--;
            }
        }
        printf("%.1f%%\n", total == 0 ? 0 : same * 100.0 / total);
    }
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/veeupup/p/12682158.html
Recomendado
Clasificación