今天考的真是……大起大落……

String

  QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?)

  反正最后的结果就是……我当成:后面每行只需要和第一行check一下就可以了。

  因为那个图真的很像在搞串的匹配啊……一格一格往过移,看能不能匹配

  然后不就是每个s[i]对A取一下模,然后KMP?看有多少个位置能匹配咯。。。

  (其实这是A=B时的做法)

  将原序列增长一倍(复制一遍),对A取模做一遍,然后再对B取模做一遍,看有哪些位置是合法的,统计一下……

  然而其实正解可以证明出来当$A \not = B$的时候,可以当A=B做……也就是说,上面那种做法……是可以AC的-_-b

 

  P.S.正解是KMP来找循环节= = n如果可以整除n-next[n],那么循环节长度就是n-next[n]……可匹配长度就是……那么多……啊反正差不多啦

 1 //Round6 A
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define rep(i,n) for(int i=0;i<n;++i)
 8 #define F(i,j,n) for(int i=j;i<=n;++i)
 9 #define D(i,j,n) for(int i=j;i>=n;--i)
10 #define pb push_back
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
17     return r*v;
18 }
19 const int N=2000010;
20 /*******************template********************/
21 
22 
23 int a[N],b[N],c[N],A,B,n,ans,nxt[N];
24 bool yes[N];
25 void init(){
26     n=getint(); A=getint(); B=getint();
27     F(i,1,n) a[i]=getint();
28     memset(yes,0,sizeof yes);
29     ans=0;
30 }
31 void KMP(int *s,int n){
32     int m=n*2;
33     nxt[1]=0; int j=0;
34     F(i,2,n+1){
35         while(j && s[i]!=s[j+1]) j=nxt[j];
36         if (s[i]==s[j+1]) j++;
37         nxt[i]=j;
38     }
39     j=0;
40     F(i,2,m-1){
41         while(j && b[i]!=s[j+1]) j=nxt[j];
42         if (b[i]==s[j+1]) j++;
43         if (j==n) yes[i]=1,j=nxt[j];
44     }
45 }
46 void work(){
47     F(i,1,n) c[i]=b[i]=b[i+n]=a[i]%A;
48     KMP(c,n);
49     if (A!=B){
50         F(i,1,n) c[i]=b[i]=b[i+n]=a[i]%B;
51         KMP(c,n);
52     }
53     F(i,n,n*2-1) ans+=yes[i];
54     printf("%d\n",ans?ans+1:0);
55 }
56 int main(){
57     int T=getint();
58     while(T--){
59         init();
60         work();
61     }
62     return 0;
63 }
View Code

相关文章: