HUD 2203 亲和串
Time Limit: 3000/1000 MS (Java/Others)
Memory Limit: 32768/32768K (Java/Others)
【题目描述 - Problem Description】
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
【输入 - Input】 |
【输出 - Output】 |
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。 |
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。 |
【输入样例 - Sample Input】 |
【输出样例 - Sample Output】 |
AABCD CDAA ASD ASDF |
yes no |
【题解】
把需要比对的串翻倍即可,注意数组的长度,然后可耻地照搬POJ 3461了
【代码 C++】
1 #include<stdio.h> 2 #include<cstring> 3 #define mx 100005 4 char w[mx], t[mx << 1]; 5 int next[mx], wED, tED; 6 void rdy(){ 7 int i = 0, j; 8 next[0] = j = -1; 9 while (i <= wED){ 10 if (j == -1 || w[i] == w[j]) next[++i] = ++j; 11 else j = -1; 12 } 13 w[wED] = ‘#‘; 14 } 15 int count(){ 16 int iw = 0, it = 0; 17 while (it < tED){ 18 while (w[iw] == t[it] || iw == -1) ++iw, ++it; 19 if (iw == wED) return 1; 20 iw = next[iw]; 21 } 22 return 0; 23 } 24 int main(){ 25 while (~scanf("%s%s", t, w)){ 26 tED = strlen(t); wED = strlen(w); 27 if (wED > tED){ puts("no"); continue; } 28 memcpy(&t[tED], t, sizeof(w)); 29 tED <<= 1; 30 rdy(); 31 if (count()) puts("yes"); 32 else puts("no"); 33 } 34 return 0; 35 }
时间: 2025-01-16 11:08:16