牛客每日練習----慄醬的數列,模擬戰役,素數迴文

我從前最怕旁人火眼金睛,如今,倒是盼着有人能夠洞幽燭遠。如此,就能贈我一點歡喜。

鏈接: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章