字符串习题

poj 2406:

  这道题出的很好,让我明白了kmp循环节的性质。不过,不知是我太弱,还是网上大牛太多,大家都是直接找到最小的循环节之后就直接判断它是否整除n了。我想了好久,一直不明白一个问题。

  假设最小循环节的长度为D。如果存在长度为d的循环节,它满足d>D且d不是D的倍数,这种情况是怎么判断的(就是存在大于最小循环节且不是最小循环节倍数的循环节)。后来…发现如果存在的话,那么必然存在长度为gcd(d,D)的循环节…然后gcd(d,D)<D,于是就证明出不存在这种情况。

  综上,所有的循环节的长度都必然是最短的循环节的长度的倍数。

 1 //13365733  ooyyloo 2406    Accepted    5248K   125MS   G++ 939B    2014-08-23 14:44:15 (第二次)
 2 //13365580  ooyyloo 2406    Accepted    5248K   79MS    G++ 772B    2014-08-23 14:21:11
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <algorithm>
 6 #include <cstring>
 7 #define rep(i, n) for (int i = 0; i < (n); i++)
 8 #define FOR(i,l,r) for (int i = (l); i <= (r); i++)
 9 using namespace std;
10 const int maxn=1000001;
11
12 int n;
13 char str[maxn];
14 int fail[maxn];
15 int main(){
16     for (; ; )
17     {
18         scanf("%s", str);
19         if (str[0]==‘.‘) break;
20         n = strlen(str);
21         int j = 0;
22         FOR (i, 2, n)
23         {
24             while (j && str[j] != str[i-1]) j = fail[j];
25             if (str[j] == str[i-1]) j++;
26             fail[i] = j;
27         }
28         /*j = fail[n];
29         while (j && n % (n-j) != 0) j = fail[j];
30         if (j == 0) printf("1\n");
31         else printf("%d\n", n / (n - j));*/
32         if (n % (n-j) == 0) printf("%d\n", n / (n - j));
33         else puts("1");
34     }
35     return 0;
36 }
37 //第二次比第一次的时间复杂度的原因是poj评测机发烧...两种做法时间是一样的

poj 2406

时间: 2024-10-05 04:58:47

字符串习题的相关文章

openjudege -字符串-习题31:字符串P型编码

31:字符串p型编码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个2.1个3.2个4.3个1",因此我们说122344111的p型编码串为1122132431:类似的道理,编码串101可以用来描述1111111111:00000000000可描述为"11个0",因此它

[日常] Go语言圣经--复数,布尔值,字符串习题

go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度 2.complex函数用于构建复数,real和imag函数分别返回复数的实部和虚部 go语言圣经-布尔型 1.布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为 2.&&的优先级比||高 go语言圣经-字符串 1.一个字符串是一

java-数字与字符串-习题

自动装箱 不需要调用构造方法,通过=符号自动把 基本类型 转换为 类类型 就叫装箱 int i = 5; //基本类型转换成封装类型 Integer it = new Integer(i); //装箱->实质它做了这个操作 //自动转换就叫装箱 Integer it2 = i; 自动拆箱 int i = 5; Integer it = new Integer(i); //封装类型转换成基本类型 int i2 = it.intValue(); // 拆箱->实质它做了这个操作 //自动转换就叫拆

LeetCode刷题总结-字符串篇

本文梳理对LeetCode上有关字符串习题的知识点,并给出对应的刷题建议.本文建议刷题的总数为32题.具体知识点如下图: 1.回文问题 题号:5. 最长回文子串,难度中等 题号:214. 最短回文串,难度困难 题号:564. 寻找最近的回文数,难度困难 2.子串问题(类似子集) 题号:76. 最小覆盖子串,难度困难 题号:115. 不同的子序列,难度困难 题号:522. 最长特殊序列 II,难度中等 题号:1163. 按字典序排在最后的子串,难度困难 3.表达式求值问题 题号:12. 整数转罗马

Head First Java(第2版)中文版pdf

下载地址:网盘下载 内容简介  · · · · · · <Head First Java>是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导.此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程.网络与分布式程序等项目.最重要的,你会学会如何像个面向对象开发者一样去思考. 而且不只是读死书,你还会玩游戏.拼图.解谜题以及以意想不到的方式与Java交互.在这些活动中,你会写出一堆真正的Java程序,包括了一个船舰炮战游戏和一个网络聊天程序

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

[华为机试练习题]43.在字符串中找出连续最长的数字串

题目 描述: 请一个在字符串中找出连续最长的数字串,并把这个串的长度返回:如果存在长度相同的连续数字串,返回最后一个连续数字串: 注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串"1234"的长度就小于数字串"1359055",如果没有数字,则返回空字符串("")而不是NULL! 样例输入 abcd12345ed125ss123058789 abcd12345ss54761 样例输出 输出123058789,函数返回值9 输出547

YTU 2419: C语言习题 等长字符串排序

2419: C语言习题 等长字符串排序 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 426  Solved: 169 [Submit][Status][Web Board] Description 在主函数中输入n(n<=10)个等长的字符串.用另一函数对它们排序.然后在主函数输出这n个已排好序的字符串. Input n和n个等长字符串 Output n个已排好序的字符串 Sample Input 5 abcdf 12345 ert45 fg4

问题 A: 习题7-5 字符串逆序存放

问题 A: 习题7-5 字符串逆序存放 时间限制: 1 Sec  内存限制: 12 MB献花: 173  解决: 152[献花][花圈][TK题库] 题目描述 写一个函数将一个字符串按反序存放.在主函数中输入一个字符串,通过调用该函数,得到该字符串按反序存放后的字符串,并输出. 输入 一行字符串. 输出 输入字符串反序存放后的字符串.单独占一行. 样例输入 abcd 样例输出 dcba 参考代码: #include<stdio.h>#include<string.h> int ch