我從前最怕旁人火眼金睛,如今,倒是盼着有人能夠洞幽燭遠。如此,就能贈我一點歡喜。
鏈接:https://ac.nowcoder.com/acm/problem/14694
來源:牛客網
題目描述
慄醬有一個長度爲n的數列A,一個長度爲m的數列B,現在詢問A中有多少個長度爲m的連續子序列A',
滿足(a'1+b1)%k = (a'2+b2)%k = …… = (a'm + bm)%k。
輸入描述:
第一行一個數T,表示有T組數據。
對於每組數據,
第一行三個整數,n, m, k。
第一行輸入n個數, a1,a2,…,an, 表示A數列中的數,
第二行輸入m個數, b1,b2,…,bm, 表示B數列中的數。
輸出描述:
每一組數據輸出一行,滿足條件的連續子序列數量。
示例1
輸入
2 3 2 5 7 8 7 8 7 3 2 5 7 8 9 8 7
輸出
1 2
備註:
T≤15,
2≤m≤n≤2×105,
1≤ai,bi,k≤109
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x7ffffff
#define P pair<int,int>
typedef long long ll;
using namespace std;
const ll MOD=1e9+7;
int T,n,m;
ll a[200010],b[200010],k;
void getnext(int nx[]){
nx[0]=-1;
int j=-1,i=0;
while(i<m-1){
if(j==-1||b[j]==b[i]){
j++;
i++;
if(b[j]==b[i])
nx[i]=nx[j];
else
nx[i]=j;
}
else
j=nx[j];
}
}
int kmp(){
int nx[200010],ans=0,i=0,j=0;
getnext(nx);
while(i<n-1){
if(j==-1||(a[i]+b[j])%k==0){
j++;
i++;
if(j==m-1){
j=nx[j];
ans++;
}
}
else
j=nx[j];
}
return ans;
}
int main()
{
scanf("%d",&T);
while( T-- ){
scanf("%d%d%lld",&n,&m,&k);
for( int i=1; i<=n; i++ ){
scanf("%lld",&a[i]);
a[i]%=k;
}
for( int i=0; i<n-1; i++ )
a[i]=(a[i+2]-a[i+1]+k)%k;
for( int i=1; i<=m; i++ ){
scanf("%lld",&b[i]);
b[i]%=k;
}
for( int i=0; i<m-1; i++ )
b[i]=(b[i+2]-b[i+1]+k)%k;
printf("%d\n",kmp());
}
return 0;
}
鏈接:https://ac.nowcoder.com/acm/problem/14698
來源:牛客網
題目描述
齊齊和司機在玩單機遊戲《紅色警戒IV》,現在他們的遊戲地圖被劃分成一個n*m的方格地圖。齊齊的基地在最上方的4行格內,司機的基地在最下方的4行格內。他們只有一種攻擊方式:遠程大炮,相關屬性如下:
1、 大炮可以打到地圖的任意一個位置。
2、 雙方每次必須動用本方的一門大炮攻擊,齊齊先手,雙方交替進行攻擊。
3、 一方大炮只能攻擊另一方大炮,不能攻擊本方或強制攻擊未獲得視野的地區。
4、 被一方大炮擊中的另一方大炮會產生以攻擊點爲中心的3*3的波及區域,波及區域內如果有其他大炮則也會產生3*3的波及區域。
5、 兩方的基地相距很遠,所以不存在攻打敵方大炮時波及到本方大炮的情況。
齊齊偷偷開了“間諜衛星”,所以他能看到司機的大炮部署,司機則無視野。但如果齊齊做出攻擊,司機會立即獲取到發動攻擊的大炮的視野,並在回合開始時動用大炮(如果存在的話)將其摧毀(摧毀後可能產生的連鎖不計入視野)。
現在給出齊齊和司機的大炮部署,問齊齊在選擇最優的策略下,在摧毀所有司機的大炮後可以保留最多幾門本方大炮。
輸入描述:
第1行輸入一個整數m,表示地圖的寬度。 第2-5行,每行輸入一串長度爲m的字符串,代表司機的大炮部署。(大炮爲"*"號,空地爲“.”號) 第6-9行,每行輸入一串長度爲m的字符串,代表齊齊的大炮部署。(大炮爲"*"號,空地爲“.”號) 數據保證:0<m≤100
輸出描述:
輸出一行,一個整數。代表摧毀所有司機的大炮後最多保留幾門大炮。如果不能摧毀所有司機的大炮,則輸出-1。
示例1
輸入
3 ... .*. ..* *.. *.. .** ... *.*
輸出
4
示例2
輸入
3 *.. ..* ... ... ... ... .*. ...
輸出
-1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x7ffffff
#define P pair<int,int>
typedef long long ll;
using namespace std;
const ll MOD=1e9+7;
int num,w,numq,nump,qq[10000],pp[10000];
char q[10][110],p[10][110];
bool visq[10][110],visp[10][110];
void dfsp(int x,int y)
{
if(visp[x][y])
return;
num++;
visp[x][y]=1;
for(int i=-1;i<=1;i++)
{
for(int j=-1;j<=1;j++)
{
if(i==j&&i==0)
continue;
int nx=x+i,ny=y+j;
if(nx<=0||ny<=0||nx>4||ny>w)
continue;
if(p[nx][ny]=='*')
dfsp(nx,ny);
}
}
}
void dfsq(int x,int y)
{
if(visq[x][y])
return;
num++;
visq[x][y]=1;
for(int i=-1;i<=1;i++)
{
for(int j=-1;j<=1;j++)
{
if(i==j&&i==0)
continue;
int nx=x+i,ny=y+j;
if(nx<=0||ny<=0||nx>4||ny>w)
continue;
if(q[nx][ny]=='*')
dfsq(nx,ny);
}
}
}
int main()
{
cin>>w;
for(int i=1;i<=4;i++)
for(int j=1;j<=w;j++)
cin>>p[i][j];
for(int i=1;i<=4;i++)
for(int j=1;j<=w;j++)
cin>>q[i][j];
for(int i=1;i<=4;i++)
{
for(int j=1;j<=w;j++)
{
if(p[i][j]=='*'&&!visp[i][j])
{
num=0;
dfsp(i,j);
pp[nump++]=num;
}
}
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=w;j++)
{
if(q[i][j]=='*'&&!visq[i][j])
{
num=0;
dfsq(i,j);
qq[numq++]=num;
}
}
}
if(nump>numq)
printf("-1\n");
else
{
int total=0;
sort(qq,qq+numq);
for(int i=0;i<numq;i++)
total+=qq[i];
for(int i=0;i<nump-1;i++)
total-=qq[i];
printf("%d\n",total);
}
return 0;
}
鏈接:https://ac.nowcoder.com/acm/problem/14703
來源:牛客網
題目描述
現在給出一個素數,這個素數滿足兩點:
1、 只由1-9組成,並且每個數只出現一次,如13,23,1289。
2、 位數從高到低爲遞減或遞增,如2459,87631。
請你判斷一下,這個素數的迴文數是否爲素數(13的迴文數是131,127的迴文數是12721)。
輸入描述:
輸入只有1行。
第1行輸入一個整數t,保證t爲素數。
數據保證:9<t<109
輸出描述:
輸出一行字符串,如果t的迴文數仍是素數,則輸出“prime”,否則輸出"noprime"。
示例1
輸入
13
輸出
prime
說明
13的迴文數是131,131是素數
示例2
輸入
17
輸出
noprime
說明
17的迴文數是171,171不是素數(因子有3)
備註:
素數定義爲在大於1的自然數中,除了1和它本身以外不再有其他因數。 素數的迴文數爲題意中的定義,1331不是素數的迴文數。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x7ffffff
#define P pair<int,int>
typedef long long ll;
using namespace std;
const ll MOD=1e9+7;
ll jh(ll n)
{
ll num=n/10;
while(n)
{
num=num*10+n%10;
n/=10;
}
return num;
}
bool is_prime(ll n)
{
for(ll i=2;i<=sqrt(n+0.5);i++)
if(n%i==0)
return false;
return true;
}
int main()
{
ll n,cd;
cin>>n;
cd=jh(n);
if(is_prime(cd))
cout<<"prime\n";
else
cout<<"noprime\n";
return 0;
}