字符串截取模板 && POJ 3450、3080 ( 暴力枚举子串 && KMP匹配 )
//截取字符串 ch 的 st~en 这一段子串返回子串的首地址 //注意用完需要根据需要最后free()掉 char* substring(char* ch,int st,int en) { ; char* pch=ch; ); pch=pch+st; ;i<length;i++) subch[i]=*(pch++); subch[length]='\0'; return subch; }
字符串截取
题意 : 给出 n 个包含 60 个字符的字符串,问你这 n 个字符串的最长公共子串是什么,如果有多个,输出字典序最小的,如若没有则输出 “no significant commonalities”
分析 : 直接选择第一个串然后从长到短截取各个长度的子串去跟剩下的 n-1 个串进行匹配,如果得以匹配则比较这个长度下的其他未枚举的子串,选出字典序最小的继续匹配,持续更新答案,最后输出即可。
#include<string.h> #include<stdio.h> #include<string> #include<malloc.h> #include<stdlib.h> using namespace std; + ; ][maxn], fir[maxn]; char * mo, * ans; int num, Next[maxn], moL; char* substring(char* ch,int st,int en) { ; char* pch=ch; ); pch=pch+st; ;i<length;i++) subch[i]=*(pch++); subch[length]='\0'; return subch; } inline void GetNext() { , j = -; Next[i] = j; while(i < moL){ && mo[i]!=mo[j]) j = Next[j]; Next[++i] = ++j; } } bool KmpCount(int who) { , j = ; ){ && mo[j]!=str[who][i]) j = Next[j]; i++, j++; } if(j == moL) return true; return false; } bool Is_Match(int st, int en) { moL = en - st + ; mo = substring(fir, st, en); GetNext(); ; k<num; k++){ if(!KmpCount(k)) return false; }return true; } inline void Find_better_ans(int pos, int len, int en) { ; i<=en; i++){ ,j=i; j<=i+len; j++,k++){ if(ans[k] > fir[j]){ if(Is_Match(i, i+len)){ ans = substring(mo, , moL-); }else { free(mo); break; } }else if(ans[k] < fir[j]) break; } } } bool Have_ans() { ; len>=; len--){///枚举截取子串的长度,从大到小枚举 ; i<=-len; i++){///在这个长度下,枚举所有子串的首字母 if(Is_Match(i, i+len)){///判断是否匹配 ans = substring(mo, , moL-); Find_better_ans(i, len, -len); return true; }else free(mo); } }return false; } int main(void) { int nCase; scanf("%d", &nCase); while(nCase--){ scanf("%d", &num); scanf("%s", fir); ; i<num; i++) scanf("%s", str[i]); if(Have_ans()) { puts(ans); free(ans); } else puts("no significant commonalities"); } ; }
题意 : 给出 n 个字符串,问你最长的公共子串,没有则输出 “IDENTITY LOST”
分析 : 这次直接选一个最短的,枚举其所有的子串去匹配剩下的 n-1 个串即可
#include<stdio.h> #include<string.h> #include<malloc.h> #include<algorithm> ; char StrGroup[maxn][maxn], str[maxn], *mo, *ans; int moL, Next[maxn], num, MinL, index, Len[maxn]; char* substring(int st,int en) { ; ); ,j=st;i<length;j++,i++) subch[i]=StrGroup[index][j]; subch[length]='\0'; return subch; } inline void GetNext() { , j = -; Next[i] = j; while(i < moL){ && mo[i]!=mo[j]) j = Next[j]; Next[++i] = ++j; } } bool RunKmp(int who) { , j = ; while(j < moL && i < Len[who]){ && mo[j]!=StrGroup[who][i]) j = Next[j]; i++, j++; } if(j == moL) return true; return false; } bool RunMatch() { GetNext(); ; i<=num; i++){ if(i!=index){ if(!RunKmp(i)) return false; } }return true; } inline void Find_Better_Ans(int st, int len) { ; i<=MinL-len; i++){ ; k<len; j++,k++){ //printf("ok %s\n", ans); if(ans[k] > StrGroup[index][j]){ mo = substring(i, i+len-); moL = strlen(mo); if(RunMatch()){ free(ans); ans = mo; break; }else{ free(mo); break; } }else if(ans[k] < StrGroup[index][j]) break; } } } bool Match(int len) { ; i<=MinL-len; i++){ moL = len; mo = substring(i, i+len-); if(RunMatch()){ ans = mo; Find_Better_Ans(i, len); return true; }else free(mo); }return false; } inline void PrintAns() { ; len--) if(Match(len)){ puts(ans); free(ans); return; } puts("IDENTITY LOST"); } int main(void) { while(~scanf("%d", &num) && num){ MinL = 0x3f3f3f3f; ; i<=num; i++){ scanf("%s", StrGroup[i]); Len[i] = strlen(StrGroup[i]); if(MinL > Len[i]){ MinL = Len[i]; index = i; } }PrintAns(); } ; }
字符串截取模板 && POJ 3450、3080 ( 暴力枚举子串 && KMP匹配 )的更多相关文章
- hdu_2328_Corporate Identity(暴力枚举子串+KMP)
题目链接:hdu_2328_Corporate Identity 题意: 给你n个串,让你找这n个串的最大公共子串 题解: 串比较小,暴力枚举第一个的子串,然后KMP判断是否可行 #include&l ...
- poj 3080 Blue Jeans (暴力枚举子串+kmp)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- POJ 2912 - Rochambeau - [暴力枚举+带权并查集]
题目链接:http://poj.org/problem?id=2912 Time Limit: 5000MS Memory Limit: 65536K Description N children a ...
- POJ 3080 Blue Jeans (字符串处理暴力枚举)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21078 Accepted: ...
- 【poj 3080】Blue Jeans(字符串--KMP+暴力枚举+剪枝)
题意:求n个串的字典序最小的最长公共子串. 解法:枚举第一个串的子串,与剩下的n-1个串KMP匹配,判断是否有这样的公共子串.从大长度开始枚举,找到了就break挺快的.而且KMP的作用就是匹配子串, ...
- POJ - 3294~Relevant Phrases of Annihilation SPOJ - PHRASES~Substrings POJ - 1226~POJ - 3450 ~ POJ - 3080 (后缀数组求解多个串的公共字串问题)
多个字符串的相关问题 这类问题的一个常用做法是,先将所有的字符串连接起来, 然后求后缀数组 和 height 数组,再利用 height 数组进行求解. 这中间可能需要二分答案. POJ - 3294 ...
- Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取
1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_str ...
- Codeforces Round #410 (Div. 2)(A,字符串,水坑,B,暴力枚举,C,思维题,D,区间贪心)
A. Mike and palindrome time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...
- POJ - 1426 暴力枚举+同余模定理 [kuangbin带你飞]专题一
完全想不到啊,同余模定理没学过啊,想起上学期期末考试我问好多同学'≡'这个符号什么意思,都说不知道,你们不是上了离散可的吗?不过看了别人的解法我现在会了,同余模定理介绍及运用点这里点击打开链接 简单说 ...
随机推荐
- 创建一个项目并在GitHub上发出拉取请求
1.第一步:创建存储库 创建新存储库: New repository 命名存储库 写一个简短的描述 选择使用自述文件初始化此存储库 2.第二步:创建一个分支 创建一个新分支 转到新的存储库hello- ...
- rename批量修改文件名
批量改名: 如文件,批量修改,把hello去掉[root@localhost wang]# ll-rw-r--r-- 1 root root 0 5月 14 02:36 a.hello.txt-rw- ...
- django中使用原生的orm
只有用的时候才能执行
- 一个实用的iptables脚本(各种过滤写法参考)
#!/bin/shmodprobe ipt_MASQUERADEmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables -Fiptables -t n ...
- 索引之----mysql联合索引
重要概念: 1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条. 2.对于多列索引来说(a,b,c)其相当于3个索引(a),(a,b),(a,b,c)3个索引,又由于 ...
- SpringBoot、ActiveMQ整合阿里大鱼-----短信服务
3.短信微服务 3.1需求分析 构建一个通用的短信发送服务(独立于优乐选的单独工程),接收activeMQ的消息(MAP类型) 消息包括手机号(mobile).短信模板号(template_code ...
- 【Qt笔记】QAction与QToolButton的关联
QAction可以理解为一个动作数据,包含了这个同坐相关的图标.文本.是否可用等数据和状态,以及连接对应的槽函数,用于执行这个动作. QToolButton则可以使用QAction对象作为后端,显示这 ...
- getopt_long函数解析命令行参数
转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...
- 有序无序ul->li ol->li菜单,默认点击当前弹出下拉,再次点击收起下拉菜单
实现这一效果利用css和js技术结合 以ul->li为例子 <!DOCTYPE html><html lang="en"><head> & ...
- python学习笔记(4)
第六章 字符串操作 1.字符串处理 (1)字符串字 spam='Say hi to Bob\' s mother 面量 python中输入字符串:以单引号开始和结束 (2)双引号:字符串可以用双引号开 ...