文章目录
- 牛的语言学
- 考察知识:递推
- 题目链接
- 题目描述
- 思路
- 具体代码及注释
- 孤立点数量
- 考察知识:并查集
- 题目链接
- 题目描述
- 思路分析
- 在这里插入图片描述
- 代码及注释
牛的语言学
考察知识:递推
题目链接
https://www.acwing.com/problem/content/5559/
题目描述
思路
具体代码及注释
#include <iostream>
#include <set>
using namespace std;
const int N = 10010;
bool f[N];
//用递推,f[i]表示f[0...i]可以作为一个词根
int main() {string s;cin >> s;set<string> res; //用set存储,防止重复,而且排序好了int n = s.size();f[n - 1] = true;//从后往前递推for(int i = n - 2; i >= 4; i --) { //保证最少词根有5个长度//枚举后缀长度for(int j = 2; j <= 3; j++) {//判断后边跟着的第一个后缀是否满足if(f[i + j]) { //从后往前,故f[i + j]已经操作好了,若是可以作为词根,那么操作后缀判断//取出后缀和其后相邻的后缀进行判断string a = s.substr(i + 1, j);string b = s.substr(i + 1 + j, j); //判断是否相等,不相等或者长度不一样则满足条件if(a != b || f[i + 5]) {f[i] = true;res.insert(a); //每次其相邻的第一个后缀进行加入即可}}}}cout << res.size() << endl;for(auto &it : res) cout << it << endl;return 0;
}
孤立点数量
考察知识:并查集
题目链接
https://www.acwing.com/problem/content/5560/
题目描述
思路分析
代码及注释
#include <iostream>
using namespace std;
const int N = 100010;
int p[N];
bool st[N]; //判断是否有环
int find(int x) {if(p[x] != x) p[x] = find(p[x]);return p[x];
}
int main() {int n, m;scanf("%d%d", &n, &m);//并查集的初始化for(int i = 1; i <= n; i++) p[i] = i;while(m --) {int a, b;scanf("%d%d", &a, &b);a = find(a), b = find(b); //找集合的父节点if(a == b) st[b] = true; //若已经在一个集合中,这时候加边必然会产生环else {p[a] = b; //连接a到b的集合中st[b] |= st[a]; //若a存在环,则b也必然存在了}}//遍历int res = 0;for(int i = 1; i <= n; i++)if(p[i] == i && !st[i]) //(p[i] == i)遍历所有集合代表节点,若无环,则res = 1,累加res++;cout <<res;return 0;
}