周期字符串[UVA-455]

Periodic Strings  UVA - 455

https://vjudge.net/problem/UVA-455

书上第三章的习题3-4。题目要求判断一个给定的串的最小周期,题目保证了串的长度不大于80,因此使用朴素的暴力穷举法就可以解决。根据题意,第一个周期必然从第一个字符开始,因此只要用一个指针,从前往后扫,那么这个指针将整个串分割为两个字串,只要验证第一个字串是不是满足周期性即可。验证周期性可以依次扫描第二个字串,判断对应字符是否相等即可。我这里的对应使用了求余的方法。C++实现如下:

 1 #include<iostream>
 2 #include<cstring>
 3 int main()
 4 {
 5     using namespace std;
 6     char buf[100];
 7     bool flag;
 8     int i, k, j;
 9     cin >> k;
10     while (k--)
11     {
12         cin >> buf;
13         size_t len = strlen(buf);
14         for (i = 0; i < len; i++)
15         {
16             if (len % (i + 1) != 0)
17                 continue;
18             for (j = i + 1; j < len; j++)
19                 if (buf[j] != buf[j % (i + 1)]) break;
20             if (j == len)
21                 break;
22         }
23         if (k)
24             cout << i + 1 << endl << endl;
25         else
26             cout << i + 1 << endl;
27     }
28     return 0;
29 }
时间: 2024-12-28 13:50:25

周期字符串[UVA-455]的相关文章

UVa 455 Periodic Strings (周期串)

Periodic Strings Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Periodic Strings  A character string is said to have period k if it can be formed by concatenating one or more repetitions of anothe

UVA - 455(周期串)

求一段长度为k的字符串的最小重复周期(k<=80),代码: 思路: 周期串长度n必然能被k整除,在这一条件下,对周期小于k/2的,进行验证,验证k/n-1次,取最先成功的重复周期长度或k为最终结果 小技巧: 如果题目要求"两结果之间"有换行,那么对于最后一个case,可利用以下代码高亮处的方式来处理,使代码更简洁美观巧妙. #include"iostream" #include"cctype" #include"cstring&q

UVa 455 最小重复字符串

背景:因为一个输出之间间隔一个空行,wa了几次........ #include<stdio.h> #include<string.h> int main(void){ int t; char str[85]; scanf("%d",&t); while(t--){ getchar();getchar(); scanf("%s",str); int i=1,n=strlen(str); for(;i<=n;i++){ int o

UVa 455 - Periodic Strings 解题报告

1.题目大意 求一个长度不超过80的字符串的最小周期. 2.思路 非常简单,基本就是根据周期的定义做出来的,几乎不需要过脑. 3.应该注意的地方 (1) 最后输出的方式要注意,不然很容易就PE了.不过个人认为,其实这题Sample Output给的不好 (2) 注意输出的要求是最小周期 4.代码 #include"stdio.h" #include"string.h" #define maxn 80 int main() { int T,m,i,j,flag; ch

UVa 455 Periodic Strings

题意:给出一个字符串,找出它的最小的周期,枚举从1到len的周期,看是否满足. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 char s[105]; 8 9 int main() 10 { 11 int ncase,t,i,k,j,len; 12 scanf("%d"

周期串(Periodic Strings,UVa455)

解题思路: 对一个字符串求其最小周期长度,那么,最小周期长度必定是字符串长度的约数,即最小周期长度必定能被字符串长度整除 其次,对于最小周期字符串,每位都能对应其后周期字串的每一位, 即 ABC  ABCABC (345678)->%其字串长度3 012  3%3 4%3 5%3  6%3 7%3  8%3   0      1     2        0      1       2 if(a[j]!=a[j%3])说明不对应,不是周期,进行下一位扫描. AC Code: #include<

hihoCoder #1320 : 压缩字符串 区间dp

/** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母'A'-'Z'的字符串.他使用的方法是:如果某个子串 S 连续出现了 X 次,就用'X(S)'来表示. 例如AAAAAAAAAABABABCCD可以用10(A)2(BA)B2(C)D表示. 此外,这种压缩方法是可以嵌套的,例如HIHOHIHOCODERHIHOHIHOCODER可以表示成2(2(HIH

那些年我们一起走过正则表达式的坑

一.为什么需要学习正则表达式 正则表达式是一种应用广,灵活度高的一种查找方式,目前在爬虫爬取,对特定的内容的抓包,登录的验证等多个方面都用得上正则表达式,但是由于其实一种灵活的查找,所以我们要付出的代价就是相应使用的复杂,复杂度表现在语法上的不便记忆和应用层面上的易出错,今天我们就来谈谈正则表达式在应用层面上常出现的错误 二.正则表达式常见坑 1.零宽断言理解错误 零宽断言匹配的相当于是一个位置,不是一个具体的内容 示例: 将字符串str="test.com"的.前面的替换为1,也就是

POJ 2406 Power Strings KMP运用题解

本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都觉得是可以利用next数组的,但是自己想了很久没能这么简洁地总结出来,也只能查查他人代码才恍然大悟,原来可以这么简单地区求一个周期字符串的最小周期的. 有某些大牛建议说不应该参考代码或者解题报告,但是这些大牛却没有给出更加有效的学习方法,比如不懂KMP,难倒不应该去看?要自己想出KMP来吗?我看不太可能有哪位大牛可以直接自己"重新创造出KMP"来吧. 好吧,不说"创造KMP