Acwing779 最长公共字符串后缀

题目大意:给定n个字符串,让你找到他们的最长公共字符串后缀是什么,可能为空。

分析:题目数据范围比较小,可以O(n*n)暴力匹配,即可解决这道问题。之所以写这道题的题解还是因为写字符串的题还不够多啊,菜的一批。

代码:

#include<bits/stdc++.h>
using namespace std;
string common(string s,string t) {
    int most = 0;
    int len = min(s.length(), t.length());
    for (int i = 0; i < len; i++) {
        if (s[i] == t[i])
            most++;
        else
            break;
    }
    return s.substr(0, most);
}
int main() {
    int n;
    while (cin >> n) {
        if (!n) break;
        string s;
        cin >> s;
        reverse(s.begin(), s.end());
        n--;
        for (int i = 0; i < n; i++) {
            string t;
            cin >> t;
            reverse(t.begin(), t.end());
            s = common(s, t);
        }
        reverse(s.begin(), s.end());
        cout << s << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/SwiftAC/p/12199693.html

时间: 2024-10-19 09:46:26

Acwing779 最长公共字符串后缀的相关文章

hdu 4691 最长公共前缀 后缀数组 +lcp+rmq

http://acm.hdu.edu.cn/showproblem.php?pid=4691 去年暑假多校赛的题,当时还不会后缀数组 现在会了,其实自己组合后缀数组跟rmq还是对的,但是题意理解有问题,于是折腾了很久,,,, 此处简单解释下题目样例吧,希望对读者有帮助  以最后一组数据为例 myxophytamyxopodnabnabbednabbingnabit 6 0 9 9 16 16 19 19 25 25 32 32 37 前两行不解释,题目叙述很清楚 从第三行,0 9 指的是第一个字

求字符串A与字符串B的最长公共字符串(JAVA)

思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列,这样就构成一个m*n的矩阵.若该矩阵的节点对应的字符相同,即m[i]=n[j]时,该节点值为1:当前字符相同节点的值 = 左上角(d[i-1, j-1])的值 +1,这样当前节点的值就是最大公用子串的长.只需以行号和最大值为条件即可截取最大子串. public String getLongest(String s1,String s2){ if(s1==null ||s2==null){ return

Java算法——求出两个字符串的最长公共字符串

问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别以行和列组成一个二维矩阵. 2.比较二维矩阵中行和列对应的每个点的字符是否相同,是设置这个点为1,否设置这个点为0. 3.通过查找值为1的最长对角线来找到最长公共字符串. 通过上面str1和str2两个字符串,分别得出以行和列组成的一个二维矩阵如下图: 从上图可以看到,str1和str2共有3个公共子串&qu

Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)

#include<bits/stdc++.h>using namespace std;const int N=1000007;char s1[N],s2[N];int len1,len2;int nex[N];int cnt1[7],cnt2[7];int main(){    scanf("%s %s",s1+1,s2+1);    len1=strlen(s1+1);    len2=strlen(s2+1);    for(int i=1;i<=len1;i++

POJ 2774 求两个串的最长公共前缀 | 后缀数组

#include<cstdio> #include<algorithm> #include<cstring> #define N 200005 using namespace std; int buf1[N],buf2[N],sa[N],rnk[N],buc[N],n,height[N],ans,belong[N]; char s[N]; void suffix_sort() { int *x=buf1,*y=buf2,m=1000; for (int i=0;i<

C++练习 | 最长公共字符串(DP)

HDU 1159.Common Subsequence #include<iostream> #include<stdio.h> #include<string> #include<cstring> #include<string.h> using namespace std; int dp[10007][10007];//a的前i个字母与b的前j个字母的有序交集长度 int main() { // freopen("01.in&quo

求两个字符串最长公共子串

一.问题描述: 最长公共子串 (LCS-Longest Common Substring) LCS问题就是求两个字符串最长公共子串的问题.比如输入两个字符串"ilovechina"和“chinabest”的最长公共字符串有"china",它们的长度是5. 二.解法 解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0.然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.如下图: i   l   o  v  e  

华为练习--查找两个字符串a,b中的最长公共子串

程序源代码: #include <iostream> #include <string> using namespace std; void findCommon(string a,string b); int main() { string a,b; getline(cin,a); getline(cin,b); string temp; if(a.length()<b.length()) { temp=a; a=b; b=temp; } findCommon(a,b);

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们