校赛——1096Is The Same?(KMP或字符串的最小、大表示法)
来源:互联网 发布:2017淘宝可以买彩票吗 编辑:程序博客网 时间:2024/06/05 22:55
1096: Is The Same?
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 26 Solved: 8
[Submit][Status][Web Board]
Description
给出2个字符串S和T,如果可以通过循环移位使得S和T相等,则我们称S和T是同构字符串, 例如S=“abcd”, T=“bcda”,则S和T是同构字符串;而S=“abcd”和T=“bcad”则不是同构字符串。
循环移位是指:在⼀个长度为n的字符串S中,取⼀个任意下标i,把字符串分为两段,分别为 S1S2...Si 和Si+1Si+2...Sn,然后把字符串变为Si+1Si+2...SnS1S2...Si,例如S=“qwerty”,取i=3, 则变 为”rtyqwe”(注意,一个字符串本⾝身也算是它的同构字符串)。
Input
第⼀行包含一个整数T(1 <= T <= 20),代表测试组数。
对于每组数据,包含2个字符串,字符串长度都小于等于105且非空,输入保证字符串只包含小写字⺟。
Output
对于每组数据,如果这两个字符串是同构字符串,则输出Yes,否则输出No。
Sample Input
2abcdbcdaabcdbcad
Sample Output
YesNo
比赛的时候用的是据说效率差不多的strstr过的,毕竟题目只是要求输出是否匹配而不是查找出现位置。KMP比较长打起来费时间而且清空数组又要打一堆
代码:
#include<iostream>#include<algorithm>#include<cstdlib>#include<sstream>#include<cstring>#include<cstdio>#include<string>#include<deque>#include<stack>#include<cmath>#include<queue>#include<set>#include<map>using namespace std;typedef long long LL;#define INF 0x3f3f3f3f#define MM(a) memset(a,0,sizeof(a))const int N=100010;char a[N],b[N],aa[2*N],bb[2*N];int nexta[N],nextb[N];inline void getnext(int ne[],char s[]){int j=0,k=ne[0]=-1;int len=strlen(s);while (j<len){if(k==-1||s[j]==s[k]){j++;k++;ne[j]=k;}elsek=ne[k];}}inline bool kmp(int ne[],char s[],char p[]){int i=0,j=0;int la=strlen(s),lb=strlen(p);while (i<la&&j<lb){if(s[i]==p[j]||j==-1){i++;j++;}elsej=ne[j];}if(j==lb)return true;elsereturn false;}int main(void){int tcase,i,j;scanf("%d",&tcase);while (tcase--){MM(a);MM(b);MM(aa);MM(bb);MM(nexta);MM(nextb);scanf("%s%s",a,b);if(strlen(a)!=strlen(b)){puts("No");continue;}strcat(aa,a);strcat(aa,a);strcat(bb,b);strcat(bb,b);getnext(nexta,a);getnext(nextb,b);if(kmp(nexta,bb,a)||kmp(nextb,aa,b))puts("Yes");elseputs("No");}return 0;}
最小表示法代码:
#include<iostream>#include<algorithm>#include<cstdlib>#include<sstream>#include<cstring>#include<cstdio>#include<string>#include<deque>#include<stack>#include<cmath>#include<queue>#include<set>#include<map>using namespace std;typedef long long LL;#define INF 0x3f3f3f3finline string minP(string s){int i=0,j=1,k=0,l=s.size(),t;while (i<l&&j<l&&k<l){t=s[(i+k)%l]-s[(j+k)%l];if(!t)k++;else{if(t>0)i+=k+1;elsej+=k+1;k=0;if(i==j)j++;}}s=s+s;return s.substr(min(i,j),l);}int main(void){ ios::sync_with_stdio(false); int tcase; string a,b; cin>>tcase; while (tcase--) { cin>>a>>b; a=minP(a); b=minP(b); if(a==b) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0;}
0 0
- 校赛——1096Is The Same?(KMP或字符串的最小、大表示法)
- 校赛 选修课网址 1096: Is The Same?(kmp或者find)
- hdu 3374 String Problem 【kmp+最小(大)表示法】
- 字符串-最小(大)表示法
- 【字符串最小(大)表示法+KMP求循环节】hdoj 3374 String Problem
- hdu5442-字符串循环节&最小表示法|后缀数组(未补)|kmp+最小-Favorite Donut
- Vision_字符串_最小(大)表示法
- HDU2609(字符串的最小表示法)
- HDU(3374) (KMP + 最小表示法)
- String Problem (最小表示法+KMP)
- 字符串的最小表示法
- 字符串的最小表示法
- 字符串的最小表示法
- HDU3374(String Problem)字符串-最小表示法+KMP
- hdu 3374 String Problem(字符串最小最大表示法+kmp)
- 最小(大)表示法习题 -- 来自[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher
- HDU 3374 KMP +字符串最小表示
- hdu3374 最小表示法+kmp
- factorial using c
- HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)
- HDU——4291A Short problem(矩阵快速幂+循环节)
- 当有人提给我一个bug...
- NOJ——1559Jump to the Top of Mountain(简单暴力DFS+渣渣代码)
- 校赛——1096Is The Same?(KMP或字符串的最小、大表示法)
- Maven Java EE Configuration Problem
- 关于系统重装的一件小事
- MAVEN在eclipse(kepler)里的安装配置
- 动态代理实现
- 大神是如何装逼的 之 vim插件使用taglist和nerdtree
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))
- (OK) Creates Docker-based Virtual PC containers for use inside GNS3 as end hosts.
- 找人代写安卓端DICOM查看器