题解 Luogu P3370
讲讲这题的几种做法:
暴力匹配法
rt,暴力匹配,即把字符串存起来一位一位判相等
时间复杂度$ O(n^2·m) $
再看看数据范围
\(n\le10^5,m\le10^3\)
当场爆炸。当然有暴力分
代码(20pts):
#include <bits/stdc++.h>
using namespace std;
char c[100001][1001];
bool pd(int x, int y)
{
int l1 = strlen(c[x]), l2 = strlen(c[y]);
if(l1 != l2) return 0;
for(int i = 0; i < l1; i++)
{
if(c[x][i] != c[y][i]) return 0;
}
return 1;
}
int main()
{
int n;
cin >> n;
int ans = n;
for(int i = 1; i <= n; i++)
{
cin >> c[i];
for(int j = 1; j < i; j++)
{
if(pd(i, j)) ans--;
}
}
cout << ans;
return 0;
}

好漂亮呀
不要问我为什么WA了,我也没想调
string法
比较正常的方法
思路就是把所有串存下来,用string自带的运算符(大于等于小于)进行字典序排序
然后按照字典序判断是否重复即可
时间复杂度嘛
\(O(n·logn)\)的,可以卡过
代码(100pts):
#include <bits/stdc++.h>
using namespace std;
string s[10001];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> s[i];
}
sort(s + 1, s + n + 1);//因为string自带大于和小于所以不用cmp
int ans = n;
for(int i = 1; i < n; i++)
{
if(s[i] == s[i + 1]) ans--;
//若两个字符串相同则他们的字典序一定是相邻的
}
cout << ans;
return 0;
}
C++STL法
我们当然可以用万能的STL做啦~
先来思考:我们判断一个数字是否重复是什么方法呢?
当然是bool used[1001] 啦
而这题要求判断的是字符串怎么办
把数组下标弄成string类型呗
请出主角:map
简单来讲,我们在定义数组时,只能确定数组中数的类型(比如char、bool、int、long long等等),而下标类型是固定的,即整数型
然而map可以确定这两个类型,也就是说,我们甚至可以把字符串作为下标,数字作为基本类型,来一个“反数组”(别问我反数组是啥,字面意思)
(那是不是要写成\(a_{interesting} = 3\)了)
那么结合上上上上上上上句话,这题就可做啦!
时间复杂度不明 反正能过就是了
代码(100pts):
#include <bits/stdc++.h>
using namespace std;
map < string , bool > m;//定义一个以string类型为下标的bool数组
string s;
int main()
{
int n;
cin >> n;
int ans = n;
for(int i = 1; i <= n; i++)
{
cin >> s;
if(m[s]) ans--;
else m[s] = 1;
}
cout << ans;
return 0;
}
比暴力短
HASH法
不要问为什么是最后,你见过哪个游戏让你一开始就打BOSS的?
这个和C++STL法有异曲同工之妙 说反了吧
既然字符串当不了下标,我们就把字符串转成数字嘛。
具体请看那个有几百个赞的dalao的题解吧(orz@_皎月半洒花%%%%%%)
代码(单hash,100pts):
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull base = 131;
ull a[100001];
char c[10001];
ull hashe(char s[])
{
int l = strlen(s);
ull ans = 0;
for(int i = 0; i < l; i++)
{
ans = (ans * base + (ull)(s[i])) % 200408020617;
}
return ans;
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> c;
a[i] = hashe(c);
}
sort(a + 1, a + n + 1);
ull ans = 1;
for(int i = 1; i < n; i++)
{
if(a[i] != a[i + 1]) ans++;
}
cout << ans;
return 0;
}
注:模数只写阳历生日太短会被卡?那就把 女朋友的 阴历生日加在后面鸭
题解 Luogu P3370的更多相关文章
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- 题解 Luogu P2499: [SDOI2012]象棋
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...
- 题解 luogu P1144 【最短路计数】
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...
- 题解 Luogu P3623 [APIO2008]免费道路
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- Luogu P3370 【模板】字符串哈希
方法很多,hash,双hash(个人想到一种三hash),挂链,还有STL: map 乱搞 CODE #include<iostream> #include<map> #inc ...
- [题解]luogu P4116 Qtree3
终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...
- 题解 Luogu P3959 【宝藏】
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...
- 题解 Luogu P1099 【树网的核】
这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. ...
随机推荐
- linux--->Linux centon6.9 安装mysql
Linux centon6.9 安装mysql 查看系统自带的安装包 yum list installed | grep mysql 2.上边显示有mysql 有5.1和5.5两个版本,我安装5.5 ...
- kali-2019.4中文乱码问题的解决
1.安装完kali-2019.4版出现乱码问题 2.更新源,用vi编辑器,在/etc/apt/resources.list中添加清华源 #清华大学 [更新源]deb https://mirrors.t ...
- 每天一道Java题[9]
题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...
- idea中使用Live Template自动生成方法所有参数打印
一 新建模板 二 设置代码模板 三 设置变量 表达式是支持groovy脚本的,所以这里写一个groovy脚本,生成给定格式的日志字符串,methodParameters()是idea内置的函数,获取方 ...
- 实验2: CDP命令操作
基本命令 1.获设备的相邻信息:CDP CDP1.不管上层协议 能够获取的信息包括:1.设备名2.对应各协议的地址3.端口名4.角色特征5.平台 全局启用/关闭CDP:cdp run/no cdp r ...
- Windbg实用手册
Windbg工作中用的不多,所以命令老是记不住,每次使用都要重新查命令,挺烦. 趁这次培训的机会好好测试和总结了一下,下次再用就方便多了. 在这里一起共享一下,如果有错误,请指正. 基本知识和常用命令 ...
- Linux内核单链表
主要说明Linux内核中单链表操作的关键思想,需要注意的地方 1. 假设 为了说明关键思想,对数据结构进行了精简 2. 数据结构定义 struct ListNode { int val; ListNo ...
- 【限时免费】近1000G JAVA学习视频下载
2020的情人节是个极特殊的情人节,面对肆虐的疫情,我们无法出门,宅在家里,也无法阻止你作为一名优秀程序员的梦想. 或许没有鲜花.没有蛋糕…… 姜小白就为大家备好了一份大礼,将自己近几年整理收藏的全网 ...
- [python之路]简单介绍
python介绍 #python是一个什么样的语言?编译型和解释型静态语言和动态语言强类型定义语言和弱类型定义语言python是一门动态解释性的强类型定义语言. #Python的优缺点##优点Pyth ...
- HDU_1222_GCD
http://acm.hdu.edu.cn/showproblem.php?pid=1222 直接用GCD就可以了,gcd大于1表明每次一周后偏移量为0. #include<iostream&g ...