CodeForces 235C Cyclical Quest 后缀自动机
2016-04-16 19:09
375 查看
给定母串,每次询问一个字符串及其循环串在母串中的出现次数和。
重复一遍循环串在母串上匹配即可。。。
要注意重复的不要再算一次了。
So he wants to ask “how many consecutive substrings of s are cyclical isomorphic to a given string x”. You are given string s and n strings xi, for each string xi find, how many consecutive substrings of s are cyclical isomorphic to xi.
Two strings are called cyclical isomorphic if one can rotate one string to get the other one. ‘Rotate’ here means ‘to take some consecutive chars (maybe none) from the beginning of a string and put them back at the end of the string in the same order’. For example, string “abcde” can be rotated to string “deabc”. We can take characters “abc” from the beginning and put them at the end of “de”.
The second line contains an integer n (1 ≤ n ≤ 105) — the number of queries. Then n lines follow: the i-th line contains the string xi — the string for the i-th query. The total length of xi is less than or equal to 106 characters.
In this problem, strings only consist of lowercase English letters.
5
a
ba
baa
aabaa
aaba
5
7
3
5
3
aa
aabb
abba
3
3
重复一遍循环串在母串上匹配即可。。。
要注意重复的不要再算一次了。
#include <cstdio> #include <cstring> #define FOR(i,j,k) for(i=j;i<=k;++i) const int rt = 1, N = 2000005; int ch [26], ma , fa , vis , b , v , bucket ; int last = rt, cnt = rt; void add(char c, int len) { int np = ++cnt, p = last; last = np; ma[np] = len; v[np] = 1; while (p && !ch[p][c]) ch[p][c] = np, p = fa[p]; if (!p) fa[np] = rt; else { int q = ch[p][c]; if (ma[q] == ma[p] + 1) fa[np] = q; else { int nq = ++cnt; ma[nq] = ma[p] + 1; memcpy(ch[nq], ch[q], sizeof ch[q]); fa[nq] = fa[q]; fa[q] = fa[np] = nq; while (p && ch[p][c] == q) ch[p][c] = nq, p = fa[p]; } } } void sort(int *x, int *y, int n, int m) { int i; FOR(i,1,n) bucket[x[i]]++; FOR(i,1,m) bucket[i] += bucket[i - 1]; for(i=n;i;--i) y[bucket[x[i]]--] = i; } int match(char *s) { static int ts = 0; int p = rt, l = 0, c, n = strlen(s), ans = 0, i; ++ts; for (i = 0; i < 2 * n; ++i) { c = s[i % n] - 'a'; if (ch[p][c]) ++l, p = ch[p][c]; else { while (p && !ch[p][c]) p = fa[p]; if (p) l = ma[p] + 1, p = ch[p][c]; else p = rt, l = 0; } if (l >= n) { int q = p; while (n <= ma[fa[q]] || n > ma[q]) q = fa[q]; if (vis[q] != ts) { ans += v[q]; vis[q] = ts; } } } return ans; } int main() { static char str ; int n, i, t; v[rt] = 1; scanf("%s", str); n = strlen(str); for (i = 0; str[i]; ++i) add(str[i] - 'a', i + 1); sort(ma, b, cnt, n); for (i = cnt; i; --i) v[fa[b[i]]] += v[b[i]]; scanf("%d", &t); while (t--) { scanf("%s", str); printf("%d\n", match(str)); } return 0; }
C. Cyclical Quest
Some days ago, WJMZBMR learned how to answer the query “how many times does a string x occur in a string s” quickly by preprocessing the string s. But now he wants to make it harder.So he wants to ask “how many consecutive substrings of s are cyclical isomorphic to a given string x”. You are given string s and n strings xi, for each string xi find, how many consecutive substrings of s are cyclical isomorphic to xi.
Two strings are called cyclical isomorphic if one can rotate one string to get the other one. ‘Rotate’ here means ‘to take some consecutive chars (maybe none) from the beginning of a string and put them back at the end of the string in the same order’. For example, string “abcde” can be rotated to string “deabc”. We can take characters “abc” from the beginning and put them at the end of “de”.
Input
The first line contains a non-empty string s. The length of string s is not greater than 106 characters.The second line contains an integer n (1 ≤ n ≤ 105) — the number of queries. Then n lines follow: the i-th line contains the string xi — the string for the i-th query. The total length of xi is less than or equal to 106 characters.
In this problem, strings only consist of lowercase English letters.
Output
For each query xi print a single integer that shows how many consecutive substrings of s are cyclical isomorphic to xi. Print the answers to the queries in the order they are given in the input.Examples
input
baabaabaaa5
a
ba
baa
aabaa
aaba
output
75
7
3
5
input
aabbaa3
aa
aabb
abba
output
23
3
相关文章推荐
- 187. Repeated DNA Sequences
- SGU 140 Integer Sequences(扩展欧几里得)
- AsyncQueryHander的用法
- iOS ---UICollectionView简单使用
- iOS --- UIcollectionView设置头尾
- IOS开发UI系列之常用类的继承关系层次图
- js 空数组是true还是false
- ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)
- Error:failed to find Build Tools revision 21.1.1
- 百度富文本编辑器Ueditor的使用
- 交叉编译liquid-dsp-1.2.0
- UIButton实现控制动画的开始和停止
- iOS---UIViewContentMode各类型效果
- sublime text2 build system 执行带中文路经文件
- iOS UITextField修改信息
- PHP-include和require
- 【问题】Failed to send producer request with correlation id 2 to broker 0 with
- UVALive 6195 —— The Dueling Philosophers Problem
- Map很多Key-Value对应是可以此来处理!
- UITableView 总结