• ACM/ICPC竞赛


    06篇 ACM/ICPC竞赛之STL--string


    字符串是程序中经常要表达和处理的数据,我们通常是采用字符数组或字符指针来表示字符串。STL为我们提供了另一种使用起来更为便捷的字符串的表达方式:stringstring类的定义在头文件<string>中。

    string类其实可以看作是一个字符的vectorvector上的各种操作都可以适用于string,另外,string类对象还支持字符串的拼合、转换等操作。

    下面先来看一个简单的例子:

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     string s = "Hello! ", name;
     9     cin >> name;
    10     s += name;
    11     s += '!';
    12     cout << s << endl;
    13     return 0;
    14 }

    输入:
       string
    输出:
      Hello! string!




    再以题hduoj 1064--Parencoding为例,看一段用string作为容器,实现由P代码还原括号字符串的示例代码片段:

     1 int m;
     2 cin >> m; // P编码的长度
     3 string str; // 用来存放还原出来的括号字符串
     4 int leftpa = 0; // 记录已出现的左括号的总数
     5 for (int j=0; j<m; j++)
     6 { 
     7     int p;
     8     cin >> p;
     9     for (int k=0; k<p-leftpa; k++)
    10          str += '(';
    11     str += ')';
    12     leftpa = p;
    13 }

    看下面这个简单的示例:

     1 #include <iostream>
     2 #include <queue>
     3 
     4 using namespace std;
     5 
     6 class T
     7 {
     8     public:
     9 int x, y, z;
    10 T(int a, int b, int c):x(a), y(b), z(c)
    11 {
    12 }
    13 };
    14 bool operator < (const T &t1, const T &t2)
    15 {
    16 return t1.z < t2.z; // 按照z的顺序来决定t1和t2的顺序
    17 }
    18 int main()
    19 {
    20     priority_queue<T> q;
    21     q.push(T(4,4,3));
    22     q.push(T(2,2,5));
    23     q.push(T(1,5,4));
    24     q.push(T(3,3,6));
    25 
    26     while (!q.empty())
    27     {
    28         T t = q.top(); q.pop();
    29         cout << t.x << " " << t.y << " " << t.z << endl;
    30     }
    31     return 0;
    32 }
    33 
    34 输出结果为(注意是按照z的顺序从大到小出队的):
    35 
    36 3 3 6
    37 2 2 5
    38 1 5 4
    39 4 4 3


    再看一个按照z的顺序从小到大出队的例子:

     1 #include <iostream>
     2 #include <queue>
     3 
     4 using namespace std;
     5 
     6 class T
     7 {
     8     public:
     9     int x, y, z;
    10     T(int a, int b, int c):x(a), y(b), z(c){}
    11 };
    12 
    13 bool operator > (const T &t1, const T &t2)
    14 {
    15     return t1.z > t2.z;
    16 }
    17 int main()
    18 {
    19     priority_queue<T, vector<T>, greater<T> > q;
    20     q.push(T(4,4,3));
    21     q.push(T(2,2,5));
    22     q.push(T(1,5,4));
    23     q.push(T(3,3,6));
    24 
    25     while (!q.empty())
    26     {
    27         T t = q.top(); q.pop();
    28         cout << t.x << " " << t.y << " " << t.z << endl;
    29     }
    30         return 0;
    31 }
    32 
    33 输出结果为:
    34 
    35 4 4 3
    36 1 5 4
    37 2 2 5
    38 3 3 6



    如果我们把第一个例子中的比较运算符重载为:

    1 bool operator < (const T &t1, const T &t2)
    2 {
    3   return t1.z > t2.z; // 按照z的顺序来决定t1和t2的顺序
    4 }



    则第一个例子的程序会得到和第二个例子的程序相同的输出结果。

    再回顾一下用优先队列实现的题hduoj 1067--Ugly Numbers的代码:

     1 #include <iostream>
     2 #include <queue>
    3 using namespace std;
    4 typedef pair<unsigned long int, int> node_type;
    5 int main() 6 { 7   unsigned long int result[1500]; 8   priority_queue< node_type, vector<node_type>, greater<node_type> > Q; 9   Q.push( make_pair(1, 3) );
    10   for (int i=0; i<1500; i++) 11   { 12     node_type node = Q.top(); 13     Q.pop(); 14     switch(node.second) 15     { 16       case 3: Q.push( make_pair(node.first*2, 3) ); 17       case 2: Q.push( make_pair(node.first*3, 2) ); 18       case 1: Q.push( make_pair(node.first*5, 1) ); 19     } 20     result = node.first; 21   } 22   int n; 23   cin >> n; 24   while (n>0) 25   { 26     cout << result[n-1] << endl; 27     cin >> n; 28   } 29   return 0; 30 }

    未完待续》》》

     

     

     

  • 相关阅读:
    c#——树的深度,广度优先遍历与迭代器(IEnumerable<T>)的结合使用
    弱网下移动端网络连接处理策略
    弱网络环境下最优调度和优化传输层协议方案
    Wpf ToolTip 绑订
    minio配置
    使用本机映像优化 NET 桌面应用
    Linux内核内存管理:系统内存布局-内核空间和用户空间
    mysql 的 limit 与sql server 的 top n
    win 10 遇到某文件一直在占用导致无法关闭,或者去任务管理器找不到服务怎么办?具体解决
    sql server
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4480300.html
Copyright © 2020-2023  润新知