Форум программистов, компьютерный форум CyberForum.ru

Анаграммы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ static указатель на метод (LNK2001) http://www.cyberforum.ru/cpp-beginners/thread853861.html
Имеется класс A, один из его методов B(int a) нужно указать напрямую (по адресу). Делал так: #include "windows.h" class A { public: static void (__thiscall* B)( int a); }; void main()
C++ Вывести первое слово!с++ У меня есть файл, и в нем мне нужно вывести ТОЛЬКО первые слова. Например. Роман 1996 студент Владимир 1991 викладач Лилия 1999 школьник. И мне нужно вівести из файла только имена Роман, Владимир, Лилия в столбец. http://www.cyberforum.ru/cpp-beginners/thread853837.html
C++ Два потока winapi
Ребят ребят,два потока нужно сделать в проге,вот хотел узнать,это только через WINAPI можно сделать? Нет ли какого нибудь ещё хитрого и болеменее простого способа
Массив: Описать функцию swap(A,B), меняющую местами максимальные элементы матриц А и В. C++
Надо исправить программу чтобы заработала. У самой уже ничего не получается=(( Описать функцию swap(A,B), меняющую местами максимальные элементы матриц А и В. Вот что у меня получается: #include <iostream.h> #define n 2//размерность массивов int CreateMas1(int n)//функция котороя создает массив 1 {
C++ Переставить строки матрицы в порядке увеличения сумм элементов http://www.cyberforum.ru/cpp-beginners/thread853808.html
Ребят помогите,нужно переставить строки массива в порядке увеличения сумм элементов#include <stdio.h> #include <stdlib.h> int main() { int m,n,i,j; printf("VVedite m = "); scanf("%i",&m); printf("\n VVedite n= "); scanf("%d",&n);
C++ Метод простых итераций! опять я ... и опять нужно помочь перевести на язык С++...Заранее спасибо... Прога на Паскале... Uses Crt; Var Eps,X0,Y0,X1,Y1,T1,T2,D:real; key:char; label 10; Begin textbackground(blue); Clrscr; подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.05.2013, 23:31     Анаграммы
На коленке, но все пары анаграмм выводит.
Список слов отсюда.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <iterator>
#include <algorithm>
 
class Word {
 public:
  Word() {}
  Word(const std::string &word) : word(word), size(word.size()),
    sumOfLetters(getSumOfLettersForAWord(word)), sorted(word) {
    std::sort(sorted.begin(), sorted.end());
  }
  const std::string &getWord() const { return word; }
  const std::string &getSortedWord() const { return sorted; }
  int getSize() const { return size; }
  int getSumOfLetters() const { return sumOfLetters; }
  static int getSumOfLettersForAWord(const std::string &word) {
    int result = 0;
    for (size_t i = 0; i < word.size(); ++i) {
      result += word[i];
    }
    return result;
  }
 private:
  std::string word;
  int size;
  int sumOfLetters;
  std::string sorted;
};
 
bool operator<(const Word &a, const Word &b) {
  if (a.getSize() == b.getSize()) {
    if (a.getSumOfLetters() == b.getSumOfLetters()) {
      return a.getWord() < b.getWord();
    }
    return a.getSumOfLetters() < b.getSumOfLetters();
  }
  return a.getSize() < b.getSize();
}
 
std::ostream &operator<<(std::ostream &stream, const Word &word) {
  return stream << "Word{" <<
    "word='" << word.getWord() << "'," <<
    "size=" << word.getSize() << "," <<
    "sumOfLetters=" << word.getSumOfLetters() << "}";
}
 
int main() {
  std::ifstream file("brit-a-z.txt");
  std::set<Word> words;
 
  while (!file.eof()) {
    std::string word;
    std::getline(file, word);
    if (!file.eof()) {
      words.insert(Word(word));
    }
  }
 
  for (std::set<Word>::const_iterator i = words.begin(); i != words.end();) {
    std::set<Word>::const_iterator j = i; ++j;
    while (j->getSize() == i->getSize() && j->getSumOfLetters() == i->getSumOfLetters()) {
      ++j;
    }
 
    for (std::set<Word>::const_iterator k = i; k != j; ++k) {
      std::set<Word>::const_iterator l = k;
      for (++l; l != j; ++l) {
        if (k->getSortedWord() == l->getSortedWord()) {
          std::cout << k->getWord() << " <-> " << l->getWord() << std::endl;
        }
      }
    }
    i = j;
  }
 
  return 0;
}
Добавлено через 1 минуту
Суть в том, что все слова сортируются по длине, затем по сумме символов.
Потом проходим по всем группам одинаковой длинны и одинаковой сумме символов, набирая из них настоящие пары анаграмм.
 
Текущее время: 07:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru