今天考的真是……大起大落……
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 }