Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 14:58   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Моё решение может не столь элегантное, как у Ромахи, но я свою тоже сдал сейчас

Я сформировал множество из неповторяющихся перестановок (сдвигов) с помощью Set, в который нельзя вставить одинаковые элементы. Точнее он игнорирует вставку одинаковых элементов.

Есть цикл по количеству уникальных подстрок. В этом цикле нахожу в главной строке количество этих подстрок и суммирую их.

Код:
/* 
 * File:   main.cpp
 * Author: Ivan
 *
 * Created on February 5, 2014, 9:37 AM
 */

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

string shiftStringToLeft(const string &inStr) {
    string str = inStr;
    if (!str.empty()) {
        char c = str[0];
        str = str.substr(1, str.size() - 1);
        str.push_back(c);
    }
    return str;
}

void numberOfDifferentPermutations(const string &inStr, set<string> &outArray) {
    int n = inStr.size();
    string str = inStr;
    for (int i = 0; i < n; ++i) {
        outArray.insert(str);
        str = shiftStringToLeft(str);
    }
}

int amountOfSubstrings(string inStr, string substr) {
    int nfound = 0;
    size_t found = inStr.find(substr);
    while (found != string::npos) {
        nfound++;
        found = inStr.find(substr, found+1);
    }
    return nfound;
}

int nCyclicalSubstrings(string inStr, string substr) {
    set<string> outArray;
    numberOfDifferentPermutations(substr, outArray);
    set<string>::const_iterator it = outArray.begin();

    int nfound = 0;
    int size = outArray.size();
    for (int i = 0; i < size; ++i) {
        nfound += amountOfSubstrings(inStr, *it);
        it++;
    }

    return nfound;
}

int main(int argc, char** argv) {
    string inFileName = "input.txt";
    ifstream in;
    in.open(inFileName.c_str());
    if (!in.is_open()) {
        cerr << "Error: could not open the file " << inFileName.c_str() << endl;
        return 1;
    }

    string outFileName = "output.txt";
    ofstream out;
    out.open(outFileName.c_str());
    if (!out.is_open()) {
        cerr << "Error: could not open the file " << outFileName.c_str() << endl;
        in.close();
        return 1;
    }

    string str;
    string substr;
    if (in >> str >> substr) {
        int result = nCyclicalSubstrings(str, substr);
        out << result << endl;
    } else {
        cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
        in.close();
        out.close();
        return 1;
    }

    in.close();
    out.close();
    return 0;
}

Последний раз редактировалось 8Observer8; 06.02.2014 в 15:04.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В поиске программы tRUSty Софт 6 29.08.2011 17:45
Глюк в поиске? garik64 Microsoft Office Word 2 20.01.2011 13:54
Ошибка в поиске... twister_answer Помощь студентам 0 08.01.2011 12:06
Ошибка в поиске. ПлоМбиРка Помощь студентам 0 01.06.2010 17:13
такая задачка..в принцепе не сложная даже новичку но в поиске ее не реально найти из за условия NEMO1991 Паскаль, Turbo Pascal, PascalABC.NET 11 06.06.2009 01:03