2019CCPC网络赛——1003——K-th occurrence

 

K-th occurrence

Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0

 

Problem Description

You are given a string S consisting of only lowercase english letters and some queries.

For each query (l,r,k) , please output the starting position of the k-th occurence of the substring SlSl+1...Sr in S.

 

 

Input

The first line contains an integer T(1≤T≤20) , denoting the number of test cases.

The first line of each test case contains two integer N(1≤N≤105),Q(1≤Q≤105) , denoting the length of S and the number of queries.

The second line of each test case contains a string S(|S|=N) consisting of only lowercase english letters.

Then Q lines follow, each line contains three integer l,r(1≤l≤r≤N) and k(1≤k≤N) , denoting a query.

There are at most 5 testcases which N is greater than 103 .

 

 

Output

For each query, output the starting position of the k-th occurence of the given substring.

If such position don't exists, output −1 instead.

 

 

Sample Input

 

2

12 6

aaabaabaaaab

3 3 4

2 3 2

7 8 3

3 4 2

1 4 2

8 12 1

1 1

a

1 1 1

 

 

Sample Output

 

5

2

-1

6

9

8

1

 

没有过的两个代码。。。留着以后改改吧(虽然不一定会动)

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main(void)
{
	int t;
	scanf("%d",&t);
	while(t--){
		int n,q;
		string s,ss;
		ss = "";
		scanf("%d %d",&n,&q);
		char a;
		for(int i=1; i<=n; i++){
			cin >> a;
			s += a;
		}
		cout << s << endl;
		
		
		for(int qq=0; qq

 

#include
#include
#include
#include
#include

using namespace std;

int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,q;
        scanf("%d %d",&n,&q);
        string s = "";
        for(int i=0; i             char a;
            cin >> a;
            s += a;
        }
        
        while(q--){
            int l,r,k;
            scanf("%d %d %d",&l,&r,&k);
            
            string temp = s;
            string ss = "";
            for(int i=l-1; i                 ss += temp[i];
            }
            
            int sum = 0;//次数
            int i;//位置
            
            int pos = temp.find(ss) + 1;
            if(pos == 0){
                cout << "-1" << endl;
            }
            else{
                int ff = 0;
                for(int i=0; i                     if(s[i] != s[0]){
                        ff = 1;
                    }
                }
                
                if(ff == 0){
                    while(!temp.empty()){
                        int pos = temp.find(ss) + 1;//第一次出现的位置 
                        sum++;
                        if(pos == 0){//没有找到这个字符串 
                            sum--;
                        }
                    
                        if(sum == k){
                            int x = temp.length() - pos;
                            int index = n - x;
                            cout << index << endl;
                            break;
                        }
                        temp.erase(0,1);

                    }
                }else if(ff == 1){
                    while(!temp.empty()){
                        int pos = temp.find(ss) + 1;//第一次出现的位置 
                        sum++;
                        if(pos == 0){//没有找到这个字符串 
                            sum--;
                        }
                    
                        if(sum == k){
                            int x = temp.length() - pos;
                            int index = n - x;
                            cout << index << endl;
                            break;
                        }
                        temp.erase(0,pos+ss.length()-1);

                    }
                }
                
            }
        
            
             
        }
    }
    return 0;
}

你可能感兴趣的:(POJ)