BestCoder Round #88

传送门:BestCoder Round #88

分析:

A题统计字符串中连续字串全为q的个数,预处理以下或加个cnt就好了;

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <cmath>
 6 #include <iostream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <map>
11 #include <queue>
12 #include <stack>
13 #include <vector>
14 #include <bitset>
15 using namespace std;
16 
17 #define ll long long
18 #define F(i,a,b) for(int i=a;i<=b;++i)
19 #define R(i,a,b) for(int i=a;i<b;++i)
20 #define Rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)
21 #define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)
22 #define mem(a,b) memset(a,b,sizeof(a))
23 #define cpy(a,b) memcpy(a,b,sizeof(b))
24 #pragma comment(linker, "/STACK:102400000,102400000")
25 inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
26 char s[100100];
27 int t,cnt;
28 ll sum;
29 int main()
30 {
31     for(scanf("%d",&t);t--;)
32     {
33         scanf("%s",s);int len=strlen(s);cnt=sum=0;
34         for(int i=0;i<len;++i) if(s[i]=='q') sum+=cnt,cnt++;else if(cnt) {sum+=cnt;cnt=0;}
35         if(cnt) sum+=cnt;
36         printf("%lld\n",sum);
37     } 
38     return 0;
39 }
View Code

B题求出一个数字串的所有完全阿贝尔周期;

S是一个数字串,定义函数occ(S,x)occ(S,x)表示S中数字x的出现次数。

例如:S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1。

如果对于任意的i,都有occ(u,i)=occ(w,i)occ(u,i)=occ(w,i),那么我们认为数字串u和w匹配。

例如:(1,2,2,1,3)\approx(1,3,2,1,2)(1,2,2,1,3)(1,3,2,1,2)。

对于一个数字串S和一个正整数k,如果SS可以分成若干个长度为k的连续子串,且这些子串两两匹配,那么我们称k是串S的一个完全阿贝尔周期。

给定一个数字串S,请找出它所有的完全阿贝尔周期

那么对于给定的n,从1-n枚举它的因子比如k,然后判断1-k是否与k+1~2*k,2*k+1~3*k...(t*k<=n)匹配,这里要处理一下,详情见代码
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <cmath>
 6 #include <iostream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <map>
11 #include <queue>
12 #include <stack>
13 #include <vector>
14 #include <bitset>
15 using namespace std;
16 
17 #define LL long long
18 #define F(i,a,b) for(int i=a;i<=b;++i)
19 #define R(i,a,b) for(int i=a;i<b;++i)
20 #define Rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)
21 #define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)
22 #define mem(a,b) memset(a,b,sizeof(a))
23 #define cpy(a,b) memcpy(a,b,sizeof(b))
24 #pragma comment(linker, "/STACK:102400000,102400000")
25 inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
26 int t,n,cnt,a[100010],b[100010],p[100100],p1[100100];
27 int main()
28 {
29     for(scanf("%d",&t);t--;)
30     {
31         scanf("%d",&n);cnt=0;
32         F(i,1,n) scanf("%d",a+i);
33         for(int i=1;i*i<=n;++i) if(n%i==0)
34         {
35             for(int i=0;i<=n;++i) p[i]=p1[i]=0;
36             int x=n/i;
37             for(int j=1;j<=i;++j) p[a[j]]++;
38             for(int k=i*2;k<=n;k+=i) 
39             {
40                 for(int j=k-i+1;j<=k;j++) p1[a[j]]++;
41                 for(int j=1;j<=i;++j) if(p[a[j]]*(k/i-1)!=p1[a[j]]) goto l;
42             }
43             b[cnt++]=i;l:;
44             for(int i=0;i<=n;++i) p[i]=p1[i]=0;
45             for(int j=1;j<=x;++j) p[a[j]]++;
46             for(int k=x*2;k<=n;k+=x)
47             {
48                 for(int j=k-x+1;j<=k;j++) p1[a[j]]++;
49                 for(int j=1;j<=x;++j) if(p[a[j]]*(k/x-1)!=p1[a[j]]) goto l1;
50             } 
51             b[cnt++]=x;l1:;
52         }
53         sort(b,b+cnt);
54         printf("%d",b[0]);
55         for(int i=1;i<cnt;++i) if(b[i]!=b[i-1])printf(" %d",b[i]);puts("");
56     }
57     return 0;
58 }
View Code

 

 
posted @ 2016-10-01 22:34  遗风忘语  阅读(315)  评论(0编辑  收藏  举报