AcWing 779. 最长公共字符串后缀(你确定不看)
原题链接
困难
作者:
hxzz
,
2020-04-22 22:20:17
,
所有人可见
,
阅读 9020
C++ 代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
while(cin >> n, n)
{
string s, a;
int MAX = 999999;
cin >> s;
for(int i = 1; i < n; ++ i)
{
int res = 0;
cin >> a;
for(int j = 0; j < a.size() && j < s.size(); ++ j)
if(a[a.size() - 1 - j] == s[s.size() - 1 - j]) res++;
else break;
MAX = min(MAX, res);
}
if(MAX) cout << s.substr(s.size()-MAX) << endl;
else cout << endl;
}
return 0;
}
来个最简单的办法,直接reverse排序求第一个和最后一个的公共前缀并倒着输出
女少口阿
这个解法是因为为了$AC Saber$打得快在某一次突然想到的(
Orz
6 很巧妙的方法
最简单清晰的方法
排序之后,if里面是最短的字符串和最长的进行比较吗?那中间的字符串前缀不一样怎么办?
但是我也改过中间字符串前缀,测试是通过的,可我还是想不通。
不是最长的和最短的字符串,a[0]中的有个位置是所有字符串同位置中的最大值,a[n-1]则是最小的,注意这两个位置并不是相同的,但是都有一个共性就是在这两个位置之前对应的字符串前缀相同,通过min函数就是找那个比较靠前的位置,好像是这样
反了,a[0]是最小,a[n-1]是最大😂
$\texttt{sort}$ 是字典序,比如 $\def\a{\texttt} \a{aaa}<\a{ab}<\a{abc}<\a{bdsasdfafs}<\a{z}$
$\texttt{sort}$ 是字典序,比如 $\def\a{\texttt} \a{aaa}<\a{ab}<\a{abc}<\a{bdsasdfafs}<\a{z}$
大佬想问一下 这里好像只对最长 和最短的字符串 进行了判断 那么在sort后中间的字符串 怎么判定有没有后缀相反
同
因为是
sort
,所以中间的字符串字典序之差比与两旁的小注意,
sort
是对字典序排序类似 $\tt abc,aba,abe,aaaa,c$,排序后是 $\tt aaaa,aba,abc,abe,c$
请问这里面的a[i]不是从a[1]开始输入吗,那后面的a[0]怎么来的
难道这不是 $0 \sim n-1$?
%%%%%%
想问一下这种写法会越界吗,因为指针的范围限制是在a[0].size()内,但字典序最小的字符串不一定就是最短的字符串呀?求解惑!
来个更简单 的方法 直接暴力 即可
```
这个思路好,用每组中的第一个依次与后来的组内成员比较,每次比较完更新最长公共后缀长度
改了变量名称 更容易理解点
没注释看不懂啊啊。。。。
你们这评论的代码怎么写的?
为什么我粘贴赋值,格式全乱?
和打卡一样,用MarkDown的语法。就是代码块上下用```,将代码块包起来
妙啊!!!
这个写法有点问题,当n=1时,仅有一条语句,此时MAX无法更新,会导致之后if(MAX)语句访问字符串时越界,此时报错:
terminate called after throwing an instance of ‘std::out_of_range’
what(): basic_string::substr: __pos (which is 18446744073708551619) > this->size() (which is 2)
在while循环中加上if(n==1) continue; 可以解决这种特殊情况。
1
aa
0
这个过不了
for里面是不是写错了,应该是j吧,j的话j从1开始了
if(a[a.size() - 1 - j] == s[s.size() - 1 - j]) res;
for里面是j,那j从1开始,也就是从a.size-2开始判断,就是倒数第二个字母,不是倒数第一个,这里怎么回事
看懂了,厉害
最后输出的时候 这个s.size()-max 是什么意思可以解释一下嘛
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
string s[205];
int main(){
int n;
}
为什么要另外定义MAX变量
真的牛逼 简洁明了易理解
好牛啊!!!!简洁多了
牛逼666啊!!
并行比较字符,学到了
什么并行比较字符 看懂代码了 但是没看懂那里是并行比较字符
妙呀
机智的解法