题意:

      给n个串(n>=2&&n<=10),每个串长度都是60,然后问所有串的最长公共子串,如果答案不唯一输出字典序最小的。

思路:直接暴力,枚举+KMP,后缀数组


枚举+KMP
#include<stdio.h>
#include<string.h> char a[12][62] ,b[62];
int next[62]; void Get_Next(char b[])
{
int m = strlen(b);
int j = 0 ,k = -1;
next[0] = -1;
while(j < m)
{
if(k == -1 || b[j] == b[k])
next[++j] = ++k;
else k = next[k];
}
return ;
} bool KMP(char a[] ,char b[])
{
int n = strlen(a);
int m = strlen(b);
int i ,j;
for(i = j = 0 ;i < n ;)
{
if(a[i] == b[j])
{
if(j == m - 1) return 1;
i ++ ,j ++;
}
else
{
j = next[j];
if(j == -1)
i ++ ,j = 0;
}
}
return 0;
} int main ()
{
int t ,n ,i ,j ,k ,mk;
scanf("%d" ,&t);
char ans[62];
while(t--)
{
scanf("%d" ,&n);
for(i = 1 ;i <= n ;i ++)
scanf("%s" ,a[i]);
for(mk = i = 0 ;i < 60 ;i ++)
for(j = i ;j < 60 ;j ++)
{
for(k = i ;k <= j ;k ++)
b[k-i] = a[1][k];
b[j-i+1] = '\0';
Get_Next(b);
for(k = 2 ;k <= n ;k ++)
if(!KMP(a[k] ,b)) break;
if(k == n + 1)
{
if(!mk || strlen(b) > strlen(ans) || strlen(b) == strlen(ans) && strcmp(b ,ans) < 0)
{
int len = strlen(b);
for(k = 0 ;k <= len ;k ++)
ans[k] = b[k];
mk = 1;
}
}
}
if(!mk || strlen(ans) < 3)
printf("no significant commonalities\n");
else printf("%s\n" ,ans); }
return 0;
}

POJ3080方法很多(暴力,KMP,后缀数组,DP)的更多相关文章

  1. HDU 5442 Favorite Donut(暴力 or 后缀数组 or 最大表示法)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 题意:给出一串字符串,它是循环的,现在要选定一个起点,使得该字符串字典序最大(顺时针和逆时针均可),如果有 ...

  2. POJ2406 Power Strings(KMP,后缀数组)

    这题可以用后缀数组,KMP方法做 后缀数组做法开始想不出来,看的题解,方法是枚举串长len的约数k,看lcp(suffix(0), suffix(k))的长度是否为n- k ,若为真则len / k即 ...

  3. POJ 2406 KMP/后缀数组

    题目链接:http://poj.org/problem?id=2406 题意:给定一个字符串,求由一个子串循环n次后可得到原串,输出n[即输出字符串的最大循环次数] 思路一:KMP求最小循环机,然后就 ...

  4. POJ-3450 Corporate Identity (KMP+后缀数组)

    Description Beside other services, ACM helps companies to clearly state their “corporate identity”, ...

  5. 【HDU - 5442】Favorite Donut 【最大表示法+KMP/后缀数组】

    题意 给出一个长度为n的环状由小写字母组成的序列,请找出从何处断开,顺时针还是逆时针,使得字典序最大.如果两个字符串的字典序一样大,那么它会选择下下标最小的那个.如果某个点顺时针逆时针产生的字典序大小 ...

  6. POJ2406Power Strings (最小循环节)(KMP||后缀数组)

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  7. luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串

    题目链接 Description 给出\(n\)个序列.找出这\(n\)个序列的最长相同子串. 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串. 思路 参考:hzwe ...

  8. ZOJ1905Power Strings (KMP||后缀数组+RMQ求循环节)

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  9. [hdu3336]kmp(后缀数组)

    题意:求字符串s的所有前缀出现次数之和. http://www.cnblogs.com/jklongint/p/4446117.html 思路:用kmp做,简单且效率高.以前缀结尾的位置分类,令dp[ ...

随机推荐

  1. pytorch(09)transform模块(基础)

    transforms transforms运行机制 torchvision.transforms:常用的图像预处理方法 torchvision.datasets:常用数据及的dataset实现,mni ...

  2. 『笔记』2-SAT

    前置 \(SAT\) 是适定性( \(Satisfiability\) )问题的简称.一般形式为 \(k \ -\) 适定性问题,简称 \(k-SAT\) .而当 \(k>2\) 时该问题为 \ ...

  3. 前端 JS 加密漏洞挖掘篇

    案例一 oxo1 前言 某授权项目,登录口用户名和密码都进行了加密,之前从来没搞过记录一下学习过程. 看了CoolCat 师傅写的 https://github.com/TheKingOfDuck/b ...

  4. 给出镜像FreeBSD 基本要求

    硬盘 ports 500G update 500G portsnap 500G pkg arm64 amd64 i386 11-12-13 4TB 网络流量一个月专线大概2w RMB CPU 内存 其 ...

  5. vue Element-ui el-menu 左侧导航条

    <template> <!--实现左侧导航条动态渲染(三级)--> <el-menu class="el-menu-vertical-demo" @o ...

  6. myeclipse js报错

    Myeclipse 版本10.1 加载的js报错,解决方法: window -> preferences -> myeclipse -> validation,在右边下拉框找到 Ja ...

  7. Java学习历程记录(一)

    一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...

  8. Webpack 学习笔记(1) 开始

    目录 参考资料 1. 基础设定 2. 创建一个包 3. 使用配置文件完成打包命令 4. 使用 NPM Scripts 完成打包命令 参考资料 Getting Started | Webpack web ...

  9. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  10. python-3-1

    一.布尔类型    布尔值为: True 和Flase 注:区分大小写,如果写true 和false   不代表布尔类型值 小于 大于 小于等于  大于等于  对应这些判断 一般就是用布尔类型进行判断 ...