团结就是力量

团结就是力量

https://ac.nowcoder.com/acm/problem/14411

字符串同构,tarjan,hash

题意:

图片说明

分析:

不难想到用tarjan算法,将互相愿意组队的人员划分出来。但是,稍微有困难把你的便是:如何计算这只队伍的团结系数呢?

这里牵扯到了一个知识点:字符串同构!!
对于字符串a,和字符串b我们知道a经过一定的循环就会变成b。我们称a与b同构。
那么倘若我们将a,b都变为其最小的同构字符串c。
然后我们统计又多少人是同构字符串时,直接用hash表统计c的个数不就好了吗?

关键是如何变为最小的同构字符串呢?
这里给出代码:

string getmin(string s) {
    int len = s.size();int i = 0, j = 1, k = 0;
    while(i < len && j < len && k < len) {
        if (s[(i + k) % len] == s[(j + k) % len])k++;
        else if (s[(i + k) % len] > s[(j + k) % len])i = i + k + 1, k = 0;
        else if (s[(i + k) % len < s[(j + k) % len]])j = j + k + 1, k = 0;
        if (i == j)j++;
    }return (s + s).substr(min(i, j), len);
}

简单的说一下:上面又三个指针:i,j,k
分别意味着从i开始的同构字符串,从j开始的同构字符串,k就是个长度。

那么我们在每一个训话中比较的就是s[i+k],s[j+k]
即是以i开始的同构字符串和以j开始的同构字符串比较第k位。
如果第k位相等,那么k++我们比较k+1位

如果s[i+k]>s[j+k]那么我们知道了以i开始的字符串绝对不是最小同构字符串!
但是,同时我们还知道了以i+1,i+2,i+3。。。。。。i+k开始的同构字符串都不是最小字符串!
为什么这样呢?
我们假设从i+h开始,0<=h<=k
那么他一定比j+h的大,因为s[i+k]>s[j+k]啊
对不对,很简单?不难理解的。
然后这时我们就让i=i+k+1,k=0再次开始重新比较吧!

j也一样。当然我如果j==i了j++.否则就不能再比较了。
最后输出min(i,j)为什么是min(i,j)呢?
语言不大好表达,自己思考思考。当然记住也不难

如此,此题得解!!

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<stack>
using namespace std;
const int max_n = 1e5 + 100;
const int max_m = 1e5 + 100;
int n, m;
string ss[max_n];

string getmin(string s) {
    int len = s.size();int i = 0, j = 1, k = 0;
    while(i <= len && j <= len && k <= len) {
        if (s[(i + k) % len] == s[(j + k) % len])k++;
        else if (s[(i + k) % len] > s[(j + k) % len])i = i + k + 1, k = 0;
        else if (s[(i + k) % len < s[(j + k) % len]])j = j + k + 1, k = 0;
        if (i == j)j++;
    }return (s + s).substr(min(i, j), len);
}

struct edge
{
    int to, next;
}E[max_n];
int head[max_n];
int cnt = 1;
void add(int from, int to) {
    E[cnt].to = to;
    E[cnt].next = head[from];
    head[from] = cnt++;
}

int res = 0;
stack<int> st;
int dfn[max_n], low[max_n], color[max_n];
int colour = 0, tot = 0;
map<string, int> mp;
void tarjan(int u) {
    dfn[u] = low[u] = ++tot;st.push(u);
    for (int i = head[u];i;i = E[i].next) {
        int v = E[i].to;
        if (!dfn[v]) { tarjan(v);low[u] = min(low[u], low[v]); }
        else if (color[v] == 0)low[u] = min(low[u], dfn[v]);
    }if (dfn[u] != low[u])return;
    colour++;
    while (st.top() != u) {
        color[st.top()] = colour;
        mp[ss[st.top()]]++;
        st.pop();
    }color[st.top()] = colour;mp[ss[st.top()]]++;st.pop();
    for (auto it = mp.begin();it != mp.end();it++)
        res = max(res, (*it).second);
    mp.clear();
}

void solve() {
    for (int i = 1;i <= n;i++)
        if (!dfn[i])tarjan(i);
    cout << res << endl;
}
void init() {
    fill(head, head + n + 10, false);
    cnt = 1;colour = 0;tot = 0;res = 0;
    fill(dfn, dfn + +n + 10, false);
    fill(color, color + n + 10, 0);
    fill(low, low + n + 10, 0);
}

int main() {
    ios::sync_with_stdio(0);
    while (cin >> n >> m) {
        init();
        for (int i = 1;i <= n;i++) {
            cin >> ss[i];
            ss[i] = getmin(ss[i]);
        }for (int i = 1;i <= m;i++) {
            int u, v;cin >> u >> v;
            add(u, v);
        }solve();
    }
}
全部评论

相关推荐

03-06 12:44
已编辑
吉林大学 Java
是个千人厂,没听过名字。1.&nbsp;做一个自我介绍。2.&nbsp;你这个项目和技术栈从哪里学的?有报辅导班嘛[答&nbsp;都是是自己网上学的,学校教的东西没用]3.&nbsp;我看了你放在github上的项目,前端也是你写的嘛[答&nbsp;AI写的,90%精力用于后端开发,前端单纯用于作为后端逻辑的可视化技术验证(骗你的其实后端也是AI写的)]4.&nbsp;好,你觉得这些技术栈研究得最深刻的是哪个[答&nbsp;八股压根没背到后面,昨晚背了MySQL就说MySQL]5.&nbsp;那讲一下MySQL的索引[答&nbsp;从B+树选型一路吟唱到联合索引,索引失效]6.&nbsp;联合索引ABC问题,AB走索引嘛,BC走索引嘛?BAC走索引嘛?A&nbsp;or&nbsp;B&nbsp;走索引嘛[走,不走,走,不走。面试官点头说可以]7.&nbsp;讲一下项目里Redission分布式锁实现8.&nbsp;Watchdog机制具体是怎么工作9.&nbsp;消息队列有考虑过Kafka嘛,怎么选型的10.&nbsp;你这个项目消息队列可能出现什么问题,怎么解决这个问题?[瞎扯没用的,被面试官引导答了视频处理可能产生消息堆积问题,然后开始吟唱]11.&nbsp;文件分片自己写的还是用的什么框架?上传进度的Redis数据结构?上传的视频有多大?小分片大小?12.&nbsp;项目里Redis会话记忆是啥意思?[面试官说不行,没人把这个全放Redis里[生气R]]13.&nbsp;那这和直接查数据库有什么区别[扯了Token成本和解决幻觉问题之类的,给面试官听笑了,我最后也没绷住]14.&nbsp;你平时是怎么使用AI&nbsp;coding的15.&nbsp;算法,给了我一个leedcode链接,一看做过了。然后换了一道三数之和,也做过了。然后面试官说算了,让我讲讲思路吧反问:1.有什么需要提高的地方2.介绍一下部门业务有哪些这个面试官真的感官非常非常好,问问题还疯狂引导,感觉不会也会了。找实习&nbsp;&nbsp;牛客AI配图神器#
查看15道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10869次浏览 93人参与
# 你的实习产出是真实的还是包装的? #
1936次浏览 42人参与
# MiniMax求职进展汇总 #
24090次浏览 309人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7605次浏览 43人参与
# 简历第一个项目做什么 #
31722次浏览 338人参与
# 重来一次,我还会选择这个专业吗 #
433504次浏览 3926人参与
# 米连集团26产品管培生项目 #
6005次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187176次浏览 1122人参与
# 牛客AI文生图 #
21442次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152419次浏览 888人参与
# 研究所笔面经互助 #
118955次浏览 577人参与
# 简历中的项目经历要怎么写? #
310295次浏览 4216人参与
# AI时代,哪些岗位最容易被淘汰 #
63720次浏览 826人参与
# 面试紧张时你会有什么表现? #
30508次浏览 188人参与
# 你今年的平均薪资是多少? #
213111次浏览 1039人参与
# 你怎么看待AI面试 #
180086次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64329次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76515次浏览 374人参与
# 我的求职精神状态 #
448107次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363447次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160661次浏览 1112人参与
# 校招笔试 #
471054次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务