讲讲这题的几种做法:

暴力匹配法

rt,暴力匹配,即把字符串存起来一位一位判相等

时间复杂度$ O(n^2·m) $

再看看数据范围

\(n\le10^5,m\le10^3\)

当场爆炸。当然有暴力分

代码(20pts):

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char c[100001][1001];
  4. bool pd(int x, int y)
  5. {
  6. int l1 = strlen(c[x]), l2 = strlen(c[y]);
  7. if(l1 != l2) return 0;
  8. for(int i = 0; i < l1; i++)
  9. {
  10. if(c[x][i] != c[y][i]) return 0;
  11. }
  12. return 1;
  13. }
  14. int main()
  15. {
  16. int n;
  17. cin >> n;
  18. int ans = n;
  19. for(int i = 1; i <= n; i++)
  20. {
  21. cin >> c[i];
  22. for(int j = 1; j < i; j++)
  23. {
  24. if(pd(i, j)) ans--;
  25. }
  26. }
  27. cout << ans;
  28. return 0;
  29. }

好漂亮呀

不要问我为什么WA了,我也没想调

string法

比较正常的方法

思路就是把所有串存下来,用string自带的运算符(大于等于小于)进行字典序排序

然后按照字典序判断是否重复即可

时间复杂度嘛

\(O(n·logn)\)的,可以卡过

代码(100pts):

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string s[10001];
  4. int main()
  5. {
  6. int n;
  7. cin >> n;
  8. for(int i = 1; i <= n; i++)
  9. {
  10. cin >> s[i];
  11. }
  12. sort(s + 1, s + n + 1);//因为string自带大于和小于所以不用cmp
  13. int ans = n;
  14. for(int i = 1; i < n; i++)
  15. {
  16. if(s[i] == s[i + 1]) ans--;
  17. //若两个字符串相同则他们的字典序一定是相邻的
  18. }
  19. cout << ans;
  20. return 0;
  21. }

C++STL法

我们当然可以用万能的STL做啦~

先来思考:我们判断一个数字是否重复是什么方法呢?

当然是bool used[1001] 啦

而这题要求判断的是字符串怎么办

把数组下标弄成string类型呗

请出主角:map

简单来讲,我们在定义数组时,只能确定数组中数的类型(比如char、bool、int、long long等等),而下标类型是固定的,即整数型

然而map可以确定这两个类型,也就是说,我们甚至可以把字符串作为下标,数字作为基本类型,来一个“反数组”(别问我反数组是啥,字面意思)

(那是不是要写成\(a_{interesting} = 3\)了)

那么结合上上上上上上上句话,这题就可做啦!

时间复杂度不明 反正能过就是了

代码(100pts):

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. map < string , bool > m;//定义一个以string类型为下标的bool数组
  4. string s;
  5. int main()
  6. {
  7. int n;
  8. cin >> n;
  9. int ans = n;
  10. for(int i = 1; i <= n; i++)
  11. {
  12. cin >> s;
  13. if(m[s]) ans--;
  14. else m[s] = 1;
  15. }
  16. cout << ans;
  17. return 0;
  18. }

比暴力短

HASH法

不要问为什么是最后,你见过哪个游戏让你一开始就打BOSS的?

这个和C++STL法有异曲同工之妙 说反了吧

既然字符串当不了下标,我们就把字符串转成数字嘛。

具体请看那个有几百个赞的dalao的题解吧(orz@_皎月半洒花%%%%%%)

代码(单hash,100pts):

  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3. using namespace std;
  4. ull base = 131;
  5. ull a[100001];
  6. char c[10001];
  7. ull hashe(char s[])
  8. {
  9. int l = strlen(s);
  10. ull ans = 0;
  11. for(int i = 0; i < l; i++)
  12. {
  13. ans = (ans * base + (ull)(s[i])) % 200408020617;
  14. }
  15. return ans;
  16. }
  17. int main()
  18. {
  19. int n;
  20. cin >> n;
  21. for(int i = 1; i <= n; i++)
  22. {
  23. cin >> c;
  24. a[i] = hashe(c);
  25. }
  26. sort(a + 1, a + n + 1);
  27. ull ans = 1;
  28. for(int i = 1; i < n; i++)
  29. {
  30. if(a[i] != a[i + 1]) ans++;
  31. }
  32. cout << ans;
  33. return 0;
  34. }

注:模数只写阳历生日太短会被卡?那就把 女朋友的 阴历生日加在后面鸭

题解 Luogu P3370的更多相关文章

  1. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  2. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  3. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  4. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  5. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  6. Luogu P3370 【模板】字符串哈希

    方法很多,hash,双hash(个人想到一种三hash),挂链,还有STL: map 乱搞 CODE #include<iostream> #include<map> #inc ...

  7. [题解]luogu P4116 Qtree3

    终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...

  8. 题解 Luogu P3959 【宝藏】

    来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...

  9. 题解 Luogu P1099 【树网的核】

    这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. ...

随机推荐

  1. laravel 事件机制 实践总结

    laravel 事件机制 实践总结 观察者模式 在EventServiceProvider的linsten数组里面加上事件和监听器,键名是事件,键值里面的数组是一个或者多个监听器, protected ...

  2. (笔记)常用Llinu命令(一)

    Linux资源 鸟哥Linux:http://linux.vbird.org/linux_basic/ Linux命令大全:https://man.linuxde.net/ 目录切换 cd usr: ...

  3. STM8 关闭PWM输出后的电平输出问题解决

    STM系列的单片机PWM输出如果被关断比如用TIM1_CtrlPWMOutputs进行停止输出后,电平的高低处于不确定的状态. 他取决于: 1.GPIO初始化的特性 2.关断那一刻时的电平 3.CCM ...

  4. 强大的 Python 任务自动化工具!invoke 十分钟入门指南

    接着前面的<tox 教程>,以及刚翻译好的<nox文档>,我们继续聊聊 Python 任务自动化的话题. nox 的作者在去年的 Pycon US 上,做了一场题为<Br ...

  5. SUSE Linux Enterprise 11 离线安装 DLIB 人脸识别 python机器学习模块

    python机器学习模块安装 我的博客:http://www.cnblogs.com/wglIT/p/7525046.html 环境:SUSE Linux Enterprise 11 sp4  离线安 ...

  6. VS Code 1.42 发布!2020 年首个大更新

    近日(北京时间 2020 年 2 月 7 日),微软发布了 Visual Studio Code 1.42 版本,这也是 2020 年 VS Code 首次大更新.让我们来看看有哪些主要的更新. 支持 ...

  7. NLP(十九)首次使用BERT的可视化指导

      本文(部分内容)翻译自文章A Visual Guide to Using BERT for the First Time,其作者为Jay Alammar,访问网址为:http://jalammar ...

  8. kubernetes安装-kubeadm

    系统信息 角色 系统 CPU Core memory master 18.04.1-Ubuntu 4 8G slave 18.04.1-Ubuntu 4 4G 安装前准备(主节点和从节点都需要执行) ...

  9. StringBuffer StringBuilder String 区别

    String       字符串常量   不可变  使用字符串拼接时是不同的2个空间 StringBuffer  字符串变量   可变   线程安全  字符串拼接直接在字符串后追加 StringBui ...

  10. ATL的GUI程序设计(前言)

    前言 也许,你是一个顽固的SDK簇拥者: 也许,你对MFC抱着无比排斥的态度,甚至像我一样对它几乎一无所知: 也许,你符合上面两条,而且正在寻求着一种出路: 也许,你找到了一条出路--WTL,但是仍然 ...