Codeforces Round #286 (Div. 2)

A题:

给出一个长度为n的字符串,操作:在这个字符串的任意位置(前后也可以)插入一个字符,使之成为一个回文串,

而且,即使这个字符串本身就是回文串,你也必须插入一个字符。

若无法达成目的,输出"NA"

由于题意n<=10,所以直接暴力。

1.看本身是否是回文串

2.若本身不是,则暴力:

 从前到后每次去掉这个字符串的一个字符,看新形成的字符串是否为回文串,若是则在这个去掉的字符的相应位置插入这个字符,还是回文串,达成目的。

若不是,则无法达成目的,输出“NA”

我这段代码的问题:s下标从0开始,新形成的字符串下标从1开始,导致很紊乱。本来想改的,好困啊,睡觉了。

 1 #include<cstdio>
 2 #include<cstring>
 3 char s[11];
 4 int main()
 5 {
 6     while(scanf("%s",&s)!=EOF){
 7         int len=strlen(s);
 8         bool cnt=true;
 9         for(int i=1;i<=len/2;i++)
10             if(s[i-1]!=s[len-i]){
11                 cnt=false;
12                 break;
13             }
14         if(cnt){
15             for(int i=1;i<=len/2;i++)
16                 printf("%c",s[i-1]);
17             printf("%c",s[len/2]);
18             for(int i=len/2+1;i<=len;i++)
19                 printf("%c",s[i-1]);
20             printf("\n");
21             continue;
22         }
23         for(int i=1;i<=len;i++){
24             char t[11];
25             int j=0,k=1;
26             while(j<len){
27                 if(j==i-1)
28                     j++;
29                 else{
30                     t[k++]=s[j];
31                     j++;
32                 }
33             }
34             bool flag=true;
35             for(int l=1;l<k;l++){
36                 if(t[l]!=t[k-l]){
37                     flag=false;
38                     break;
39                 }
40             }
41             if(flag){
42                 i--;
43                 if(i<=len/2){
44                     for(int l=0;l<len-i;l++)
45                         printf("%c",s[l]);
46                     printf("%c",s[i]);
47                     for(int l=len-i;l<len;l++)
48                         printf("%c",s[l]);
49                     printf("\n");
50                     goto loop;
51                 }
52                 else{
53                     for(int l=0;l<len-i-1;l++)
54                         printf("%c",s[l]);
55                     printf("%c",s[i]);
56                     for(int l=len-i-1;l<len;l++)
57                         printf("%c",s[l]);
58                     printf("\n");
59                     goto loop;
60                 }
61             }
62         }
63         printf("NA\n");
64         loop: ;
65     }
66     return 0;
67 }
A题

 

 

 

 

       B. Mr. Kitayuta's Colorful Graph
 
 

Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The vertices of the graph are numbered from 1 ton. Each edge, namely edge i, has a color ci, connecting vertex ai and bi.

Mr. Kitayuta wants you to process the following q queries.

In the i-th query, he gives you two integers — ui and vi.

Find the number of the colors that satisfy the following condition: the edges of that color connect vertex ui and vertex vi directly or indirectly.

Input

The first line of the input contains space-separated two integers — n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100), denoting the number of the vertices and the number of the edges, respectively.

The next m lines contain space-separated three integers — aibi (1 ≤ ai < bi ≤ n) and ci (1 ≤ ci ≤ m). Note that there can be multiple edges between two vertices. However, there are no multiple edges of the same color between two vertices, that is, if i ≠ j(ai, bi, ci) ≠ (aj, bj, cj).

The next line contains a integer — q (1 ≤ q ≤ 100), denoting the number of the queries.

Then follows q lines, containing space-separated two integers — ui and vi (1 ≤ ui, vi ≤ n). It is guaranteed that ui ≠ vi.

Output

For each query, print the answer in a separate line.

Sample test(s)
input
4 5
1 2 1
1 2 2
2 3 1
2 3 3
2 4 3
3
1 2
3 4
1 4
output
2
1
0
input
5 7
1 5 1
2 5 1
3 5 1
4 5 1
1 2 2
2 3 2
3 4 2
5
1 5
5 1
2 5
1 5
1 4
output
1
1
1
1
2

 

 题意:有一个无向图,n个节点,m条边,其中第i条边的颜色为ci,
    2点之间,可能有多条边直接相连,但这些边的颜色不会重复。
    有q个询问,
    对每一个询问,给出点u,v,问有多少种颜色的边可以把u、v连接起来。
 
思路:链式前向星+dfs
 
 
 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 const int maxn=210;
 5 struct Edge
 6 {
 7     int to,c,next;
 8 }edge[maxn*2];       
 9 int head[maxn],tot;
10 
11 void head_init()
12 {
13     tot=0;
14     memset(head,-1,sizeof(head));
15 }
16 void addedge(int u,int v,int c)
17 {
18     edge[tot].c=c;
19     edge[tot].to=v;
20     edge[tot].next=head[u];
21     head[u]=tot++;
22 }
23 
24 bool color[maxn],flag;
25 bool vis[maxn];
26 void dfs(int cur,int col,int point)
27 {
28     if(cur==point)
29     {
30         flag=true;
31         return ;
32     }
33     if(flag)
34         return ;
35     vis[cur]=true;
36     for(int i=head[cur];i!=-1;i=edge[i].next)
37     {
38         int c=edge[i].c;
39         int v=edge[i].to;
40         if(c!=col)
41             continue;
42         if(vis[v])
43             continue;
44         dfs(v,col,point);
45         vis[v]=false;      //回溯
46     }
47 }
48 
49 int main()
50 {
51     int n,m;
52     while(scanf("%d%d",&n,&m)!=EOF)
53     {
54         head_init();               //初始化
55         memset(color,false,sizeof(color));   
56         memset(vis,false,sizeof(vis));
57         int u,v,c;
58         for(int i=1;i<=m;i++)
59         {
60             scanf("%d%d%d",&u,&v,&c);
61             addedge(u,v,c);
62             addedge(v,u,c);      //无向边
63             color[c]=true;       //标记有这种颜色
64         }
65         int q;
66         scanf("%d",&q);
67         for(int i=1;i<=q;i++)
68         {
69             scanf("%d%d",&u,&v);
70             int sum=0;
71             for(int i=1;i<=m;i++)
72                 if(color[i])          
73                 {
74                     flag=false;      //能不能到达的标记
75                     dfs(u,i,v);
76                     vis[u]=false;     //回溯
77                     if(flag)
78                         sum++;
79                 }
80             printf("%d\n",sum);
81         }
82     }
83     return 0;
84 }
15ms

 

 
 
 
 

 

转载于:https://www.cnblogs.com/-maybe/p/4385781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值